home *** CD-ROM | disk | FTP | other *** search
/ CD Actual 1 / PC Actual CD 01.iso / f1 / tutorc.arj / EJERC.DAT < prev    next >
Encoding:
Text File  |  1993-07-06  |  81.0 KB  |  3,025 lines

  1. ;
  2. ; EJERCICIOS DEL LENGUAJE C
  3. ;
  4.  
  5. ; LECCION 1
  6. begin
  7. begine "test"
  8. pregunta
  9.  
  10.   ¿Qué tipo de fichero es aquél que tiene extensión OBJ?
  11. opciones
  12. Fichero fuente
  13. Fichero objeto
  14. Fichero ejecutable
  15. Fichero de librería
  16. respuesta
  17. 2
  18. ende
  19. begine "pcc"
  20. pregunta
  21.  
  22.   ¿Quién fue el inventor del lenguaje C?
  23. respuesta
  24. Dennis Ritchie
  25. ende
  26. begine "pcc"
  27. pregunta
  28. ¿Qué imprime la siguiente sentencia C?
  29. printf ("%d %d %d", 4 + 5, -2 - 3 + 1, 8 * 5);
  30. respuesta
  31. 9 -4 40
  32. ende
  33. begine "pcc"
  34. pregunta
  35. /* ¿Qué valor toma la variable z en este programa? */
  36. main () { int x, y, z; x = 7; y = 8; z = x + y - 5; }
  37. respuesta
  38. 10
  39. ende
  40. begine "psc"
  41. pregunta
  42.  
  43.   ¿Cuáles son los pasos en el desarrollo de un programa?
  44. respuesta
  45.  
  46.   1. Escribirlo.     2. Compilarlo.     3. Enlazarlo.     4. Ejecutarlo
  47. ende
  48. begint
  49. begine "test"
  50. pregunta
  51.  
  52.   ¿Con qué tecla ejecutamos un programa en Turbo C?
  53. opciones
  54.  ALT-F5
  55.  ALT-F9
  56.  F9
  57.  CTRL-F9
  58. respuesta
  59. 4
  60. ende
  61. endt
  62. begine "prpr"
  63.  
  64.   Escribe un programa que imprima tu nombre y apellidos.
  65. ende
  66. begine "prpr"
  67.  
  68.   Haz un programa que convierta tu edad de años a días.
  69.   Por el momento, no tengas en cuenta las fracciones de
  70.   años y los años bisiestos.
  71. ende
  72. end lección 1
  73.  
  74. ; LECCION 2
  75. begin
  76. begine "psc"
  77. pregunta
  78.  
  79.   ¿Cuáles son los 5 tipos de datos básicos?
  80. respuesta
  81.  
  82.   char, int, float, double, void
  83. ende
  84. begine "test"
  85. pregunta
  86.  
  87.   ¿Cuál de los siguientes nombres de variable es incorrecto?
  88. opciones
  89.  _1
  90.  _A_
  91.  abc
  92.  3d
  93. respuesta
  94. 4
  95. ende
  96. begine "PCC"
  97. pregunta
  98. ¿Qué imprime la siguiente sentencia printf?
  99. printf ("123\b\b\"hola mundo\"");
  100. respuesta
  101. 1"hola mundo"
  102. ende
  103. begine "psc"
  104. pregunta
  105. Las constantes (y variables) de tipo char son tratadas por el C numérica-
  106. mente, es decir, se manejan con su valor ASCII. Bajo este punto de vista,
  107. el tratamiento del tipo char e int es muy similar. ¿Es igual 'A' y 65?
  108. respuesta
  109.  
  110.   Sí, se pueden considerar igual, ya que el valor ASCII de 'A' es 65.
  111. ende
  112. begine "psc"
  113. pregunta
  114.  
  115.   ¿Cuáles son los 4 modificadores de tipo?
  116. respuesta
  117.  
  118.   signed, unsigned, long, short
  119. ende
  120. begine "psc"
  121. pregunta
  122. ¿Se podría hacer las siguientes instrucciones en C?
  123.   const int x = 5;
  124.   x = 8;
  125. respuesta
  126. Las variables declaradas con el modificador de acceso const, es decir, las
  127. constantes, una vez inicializadas (en este caso con el valor 5) no se les
  128. puede asignar otro valor (en este caso se ha intentado asignar el valor 8)
  129. ende
  130. begine "psc"
  131. pregunta
  132.   ¿Porqué la siguiente cadena es incorrecta?
  133.   "Cadena de caracteres mala\"
  134. respuesta
  135. Al ser \" el caracter comilla, la cadena anterior no tiene comillas de
  136. cierre.
  137. ende
  138. begine "psc"
  139. pregunta
  140. ¿Cuál es el error cometido en las siguientes instrucciones C?
  141.   int x[5];
  142.   x[5] = 10;
  143. respuesta
  144. En este caso, el compilador no informa de ningún error, ni en compilación
  145. ni en ejecución; pero el resultado puede ser catastrófico ya que estamos
  146. poniendo el valor 10 en una posición de memoria no reservada (Mayor índ:4)
  147. ende
  148. begine "test"
  149. pregunta
  150. ¿Cuál es el resultado de la siguiente expresión C?
  151.  
  152. 2 + (1 < 2 ? 3 : 4) - 3
  153. opciones
  154. Valor 1
  155. Valor 2
  156. Valor 3
  157. Valor 4
  158. Valor 5
  159. respuesta
  160. 2
  161. ende
  162. begine "test"
  163. pregunta
  164. ¿Cuál es el resultado de la siguiente expresión C?
  165.  
  166. 2 > 3 ? 4 < 4 ? 2 : 3 : 1
  167. opciones
  168. Valor 1
  169. Valor 2
  170. Valor 3
  171. Valor 4
  172. Valor 5
  173. respuesta
  174. 1
  175. ende
  176. begine "test"
  177. pregunta
  178. ¿Cuál es el resultado de la siguiente expresión C?
  179.  
  180. 2 < 3 ? 4 < 4 ? 2 : 3 : 1
  181. opciones
  182. Valor 1
  183. Valor 2
  184. Valor 3
  185. Valor 4
  186. Valor 5
  187. respuesta
  188. 3
  189. ende
  190. begine "test"
  191. pregunta
  192. ¿Cuál es el resultado de la siguiente expresión C?
  193.  
  194. 2 > 3 ? 4 : 2 ? 3 : 1
  195. opciones
  196. Valor 1
  197. Valor 2
  198. Valor 3
  199. Valor 4
  200. Valor 5
  201. respuesta
  202. 3
  203. ende
  204. begine "test"
  205. pregunta
  206. ¿Cuál es el resultado de la siguiente expresión C?
  207.  
  208. (2 > 3) ? (4) : (-1 ? 3 : 1)
  209. opciones
  210. Valor 1
  211. Valor 2
  212. Valor 3
  213. Valor 4
  214. Valor 5
  215. respuesta
  216. 3
  217. ende
  218. begine "test"
  219. pregunta
  220. ¿Cuál es el resultado de la siguiente expresión C?
  221.  
  222. (4 >> 2) & (4 << 1)
  223. opciones
  224.  Valor 0
  225.  Valor 1
  226. respuesta
  227. 1
  228. ende
  229. begine "test"
  230. pregunta
  231. ¿Cuál es el resultado de la siguiente expresión C?
  232.  
  233. (4 >> 2) && (4 << 1)
  234. opciones
  235.  Valor 0
  236.  Valor 1
  237. respuesta
  238. 2
  239. ende
  240. begine "test"
  241. pregunta
  242.   ¿En todas las implementaciones de C son correctas estas afirmaciones?
  243.      sizeof (char) ≤ sizeof (short) ≤ sizeof (int) ≤ sizeof (long)
  244.                      sizeof (float) ≤ sizeof (double)
  245. opciones
  246. No
  247. respuesta
  248. 1
  249. ende
  250. begine "prpr"
  251.  
  252.   Dada la función
  253.     y = 1/4 x
  254.   diseñar un programa que para el valor de abcisa 4.4 dé
  255.   el correspondiente a la ordenada.
  256.  
  257.   Nota: La expresión anterior en C se escribe:
  258.     y = (1.0 / 4) * x;
  259.   o
  260.     y = (1 / 4.0) * x;
  261.   ya que si se hace
  262.     1 / 4
  263.   el resultado es 0 en vez de 0.25.
  264.  
  265.   Otras dos soluciones son:
  266.     y = ((float) 1 / 4) * x;
  267.   o
  268.     y = (1 / (float) 4) * x;
  269. ende
  270. begine "prpr"
  271.  
  272.   La Tierra no es una esfera; está ligeramente aplanada y por lo tanto
  273.   es más bien un esferoide aplanado. La fórmula para su volumen es:
  274.  
  275.      v = 4/3 π a a b
  276.  
  277.   Calcúlese el volumen de la Tierra para los siguientes datos:
  278.  
  279.      a = 12454,5 Km;
  280.      b = 12711.1 Km.
  281. ende
  282. begine "prpr"
  283.  
  284.   La relación entre temperaturas Celsius y Farenhait está dada por:
  285.  
  286.     C = 5/9 (F-32)
  287.  
  288.   Diseñar un programa que convierta 20 grados F en C.
  289. ende
  290. end lección 2
  291.  
  292. ; LECCION 3
  293. begin
  294. begine "test"
  295. pregunta
  296.  
  297.   ¿Las sentencias if y switch son condicionales o iterativas?
  298. opciones
  299. condicionales
  300. interativas
  301. respuesta
  302. 1
  303. ende
  304. begine "test"
  305. pregunta
  306. Las sentencias while, for y do son sentencias iterativas.
  307. ¿Es cierta esta afirmación?
  308. opciones
  309. No
  310. respuesta
  311. 1
  312. ende
  313. begine "psc"
  314. pregunta
  315.   ¿En qué caso(s) se asigna el valor 4 a la variable b?
  316.   if (a = 3)
  317.     b = 4;
  318. respuesta
  319.   Siempre, puesto que se asigna el valor 3 a la variable a y la condición
  320.   toma el valor 3 que es cierta. Otra cosa distinta sería: 'if (a == 3)'
  321.   en cuyo caso sólo se asignaría el 4 a b en el caso de que a valga 3.
  322. ende
  323. begine "test"
  324. pregunta
  325.   /* ¿Qué valor imprime este programa? */
  326.   void main (void)
  327.   { int x = 10; if (0 && (x = 20)) x = 30; printf ("%d", x); }
  328. opciones
  329. 10
  330. 20
  331. 30
  332. respuesta
  333. 1
  334. ende
  335. begine "psc"
  336. pregunta
  337.   /* sentencia 1: */  if (condicion) sentencia_1 else sentencia_2
  338.   /* sentencia 2: */  condicion ? sentencia_1 : sentencia_2
  339.   ¿Son siempre equivalentes estas dos sentencias?
  340. respuesta
  341.   No. En el operador ?, ni sentencia_1 ni sentencia_2 pueden ser
  342.   sentencias compuestas, mientras que en el if sí lo pueden ser.
  343. ende
  344. begine "test"
  345. pregunta
  346.  
  347.   ¿Toda sentencia switch se puede expresar con la escala if-else-if?
  348. opciones
  349. No
  350. respuesta
  351. 1
  352. ende
  353. begine "psc"
  354. pregunta
  355.  
  356.  ¿Qué ocurre si no hay ninguna sentencia default en una sentencia switch?
  357. respuesta
  358.   Que si fallan todas las comprobaciones de los case, no se ejecuta
  359.   ninguna acción en el switch. Es más, incluso el default puede ir
  360.   en cualquier sitio funcionando exactamente igual.
  361. ende
  362. begine "pcc"
  363. pregunta
  364. ¿Cuántas veces se ejecuta sentencia en el while siguiente?
  365.   i = 0;
  366.   while (i <= 10) sentencia
  367. respuesta
  368. 11
  369. ende
  370. begine "pcc"
  371. pregunta
  372. ¿Cuántas veces se ejecuta sentencia en el while siguiente?
  373.   i = 1;
  374.   while (i <= 10) sentencia
  375. respuesta
  376. 10
  377. ende
  378. begine "pcc"
  379. pregunta
  380. ¿Cuántas veces se ejecuta sentencia en el while siguiente?
  381.   i = 0;
  382.   while (i < 10) sentencia
  383. respuesta
  384. 10
  385. ende
  386. begine "test"
  387. pregunta
  388.  
  389.   ¿Toda sentencia for se puede expresar como una sentencia while?
  390. opciones
  391. No
  392. respuesta
  393. 1
  394. ende
  395. begine "pcc"
  396. pregunta
  397. ¿Cuántas veces se ejecuta sentencia en el for siguiente?
  398.   for (i = 0; i <= 10; i++)
  399.     sentencia
  400. respuesta
  401. 11
  402. ende
  403. begine "pcc"
  404. pregunta
  405. ¿Qué valor tiene la variable i al salir del for siguiente?
  406.   for (i = 1; i <= 10; i++)
  407.     sentencia
  408. respuesta
  409. 11
  410. ende
  411. begine "psc"
  412. pregunta
  413. ¿Cómo nos podemos salir del bucle for siguiente?
  414.   for (;;)
  415.     sentencia
  416. respuesta
  417.   La única forma de salirnos del bucle de tal forma que el control se
  418.   vaya a la sentencia siguiente es mediante la sentencia de control
  419.   break.
  420. ende
  421. begine "psc"
  422. pregunta
  423.  
  424.   ¿Qué hace la sentencia break?
  425. respuesta
  426.   La sentencia break provoca la salida inmediata de las sentencias
  427.   switch, while, for y do.
  428. ende
  429. begine "psc"
  430. pregunta
  431.  
  432.   ¿Qué hace la sentencia continue?
  433. respuesta
  434.   La sentencia continue fuerza una nueva iteración previa comprobación
  435.   de la condición del bucle en las sentencias while, for y do.
  436. ende
  437. begine "psc"
  438. pregunta
  439.  
  440.   ¿Es bueno utilizar la sentencia goto en un programa?
  441. respuesta
  442.   No, puesto que la utilización de la sentencia goto disminuye la
  443.   legibilidad de un programa.
  444. ende
  445. begine "prpr"
  446.  
  447. Diseña un programa que escriba el siguiente gráfico en pantalla,
  448. utilizando únicamente dos tipos de sentencias: la sentencia
  449. iterativa for y la sentencia de escritura: printf ("*").
  450.  
  451. *
  452. **
  453. ***
  454. ****
  455. *****
  456. ******
  457. *******
  458. ********
  459. *********
  460. **********
  461. *********
  462. ********
  463. *******
  464. ******
  465. *****
  466. ****
  467. ***
  468. **
  469. *
  470.  
  471. ende
  472. begine "prpr"
  473.  
  474.        Hacer un programa que calcule e imprima el factorial de 5.
  475. ende
  476. begine "prpr"
  477.  
  478.  Hacer un programa que genere la lista de los 100 primeros números pares.
  479.  Hacedlo de tres formas distintas: con bucle for, while y do.
  480. ende
  481. begine "prpr"
  482.  
  483.   Haz un programa que escriba todos los números menores que 50 y no
  484.   divisibles por 3.
  485. ende
  486. end lección 3
  487.  
  488. ; LECCION 4
  489. begin
  490. begine "psc"
  491. pregunta
  492.   De las funciones exit (), _exit () y abort ().
  493.   ¿Cuál es preferible utilizar para terminar un programa inmediatamente?
  494. respuesta
  495. La función exit () ya que no es bueno terminar un programa dejando los
  496. ficheros abiertos sin cerrar. La función _exit () se utiliza internamente,
  497. de hecho, las funciones exit () y abort () la llaman internamente.
  498. ende
  499. begint
  500. begine "psc"
  501. pregunta
  502.   ¿Para qué se utiliza las constantes EXIT_SUCCESS y EXIT_FAILURE
  503.   en Turbo C?
  504. respuesta
  505.  
  506.   Para pasarlas como parámetro a las función exit ().
  507. ende
  508. endt
  509. begine "psc"
  510. pregunta
  511.  
  512.   ¿Qué utilidad tiene la función assert ()?
  513. respuesta
  514.   Esta función se suele utilizar en el desarrollo del programa para
  515.   verificar que el programa funciona correctamente.
  516. ende
  517. begine "psc"
  518. pregunta
  519.   ¿A menos que se cambie, qué periférico suele ser la entrada estándar
  520.   y cuál la salida estándar?
  521. respuesta
  522.   La entrada estándar suele ser el teclado y la salida estándar suele
  523.   ser el monitor.
  524. ende
  525. begine "psc"
  526. pregunta
  527.  
  528.   ¿Qué valor tiene la constante EOF y para qué se utiliza?
  529. respuesta
  530.   Tiene el valor de -1 y se utiliza como carácter fin de fichero.
  531.   Cuando trabajamos con caracteres entre los que puede estar EOF,
  532.   debemos declarar las variables de tipo int y no de tipo char.
  533. ende
  534. begine "psc"
  535. pregunta
  536.   ¿Qué diferencia existe entre la cadena de control (utilizadas en las
  537.   funciones con formato) y la cadena de caracteres del lenguaje C?
  538. respuesta
  539.   La principal diferencia es que la cadena de control contiene en su
  540.   interior códigos de formato (empiezan con %) que junto con los otros
  541.   argumentos convierten esta cadena en una cadena de caracteres.
  542. ende
  543. begine "psc"
  544. pregunta
  545.  
  546.   ¿Qué diferencia hay entre el código de formato %d y %i?
  547. respuesta
  548.  
  549.   Ninguna. Pero por convención siempre se utiliza %d.
  550. ende
  551. begine "psc"
  552. pregunta
  553.  
  554.   ¿Cuál es la diferencia entre los códigos de formato %f, %e y %g?
  555. respuesta
  556.   Que %f siempre formatea número con notación no científica, %e lo
  557.   formatea con notación científica y %g formatea con %e o %f, el que
  558.   produzca un número con menor longitud. El que más se utiliza es %g.
  559. ende
  560. begine "psc"
  561. pregunta
  562.  
  563.   ¿Qué diferencia existe entre los códigos de formato %e y %E?
  564. respuesta
  565.   Que %e formatea la letra del exponente en minúscula (e) y %E en
  566.   mayúscula (E). Lo mismo se puede decir para los códigos de for-
  567.   mato %x y %X, y %g y %G.
  568. ende
  569. begine "psc"
  570. pregunta
  571.  
  572.   ¿Las funciones printf () y scanf () devuelven algún valor?
  573. respuesta
  574.  Sí; printf () devuelve el número de caracteres escritos en caso de éxito
  575.  o EOF en caso de error; scanf () devuelve el número de campos asignados
  576.  si ha habido éxito o EOF si ocurre un error o se detecta fin de fichero.
  577. ende
  578. begine "psc"
  579. pregunta
  580.   ¿Hacen lo mismo las dos sentencias siguientes?
  581.   ch = getchar ();
  582.   scanf ("%c", &ch);
  583. respuesta
  584. Sí, pero para leer un solo carácter es preferible utilizar la función
  585. getchar () ya que genera menos código que la función scanf (). Lo mismo
  586. se puede decir de las sentencias putchar (ch) y printf ("%c", ch).
  587. ende
  588. begine "psc"
  589. pregunta
  590.   Cuando se quiere escribir en pantalla y leer de teclado.
  591.   ¿Es preferible utilizar las funciones de entrada/salida
  592.   o las funciones de consola?
  593. respuesta
  594.   Las funciones de consola porque no se pueden redireccionar
  595.   y son más rápidas y más elegantes trabajando con consola
  596.   que las funciones de entrada/salida.
  597. ende
  598. begint
  599. begine "psc"
  600. pregunta
  601.   En la librería <conio.h> de Turbo C existe una variable global
  602.   llamada directvideo. ¿Qué valores puede tomar esta variable y
  603.   qué significado tiene cada valor?
  604. respuesta
  605.   Puede tomar dos valores: 0 y 1. El valor 1 hace que la salida
  606.   vaya directamente a RAM de vídeo y el valor 0 hace que la salida
  607.   se haga vía llamadas a la ROM BIOS. El valor por defecto es 1.
  608. ende
  609. endt
  610. begine "psc"
  611. pregunta
  612.  
  613.   ¿Qué diferencia hay entre las funciones getch () y getche ()?
  614. respuesta
  615.   En la función getch () los caracteres leídos del teclado no se
  616.   escriben en pantalla y en la función getche () sí se escriben.
  617. ende
  618. begine "psc"
  619. pregunta
  620.  
  621.   ¿Qué hace la función ungetch ()?
  622. respuesta
  623.  
  624.   Devuelve un carácter al teclado.
  625. ende
  626. begine "psc"
  627. pregunta
  628.   ¿Cuando termina el siguiente bucle?
  629.   while (! kbhit ())
  630.     sentencia
  631. respuesta
  632.  
  633.   Cuando se pulsa una tecla.
  634. ende
  635. begine "prpr"
  636.  
  637.   LECTURA Y RESOLUCION DE UN SISTEMA DE ECUACIONES CON DOS ECUACIONES
  638.   Y DOS INCOGNITAS
  639.  
  640.   Un sistema de ecuaciones lineales de la forma
  641.  
  642.     ax + by = c
  643.     dx + ey = f
  644.  
  645.   puede resolverse utilizando las siguientes fórmulas:
  646.  
  647.     x = (ce - bf) / (ae - bd)
  648.     y = (ae - cd) / (ae - bd)
  649.  
  650.   Diséñese un algoritmo para leer los dos conjuntos de coeficientes
  651.   (a, b y c; d, e y f) e imprimir los valores que son solución para
  652.   x e y. Imprímase un mensaje si el sistema no se pudiese resolver
  653.   por estas fórmulas.
  654. ende
  655. begine "prpr"
  656.  
  657.   RESOLUCION DE UNA DETERMINADA FUNCION MATEMATICA
  658.  
  659.   Diseñar un programa que lee un valor x y calcule el valor de
  660.   y=x*x+5 para el caso en que x sea menor que 0 e y=3*x-1 para
  661.   valores de x entre 0 y 2 e y=x*x-4*x+5 para x mayor que 2.
  662. ende
  663. begine "prpr"
  664.  
  665.   CALCULO DE LA SUMA DE UNA DETERMINADA SERIE
  666.  
  667.   Escribir un programa que pregunte un dato N y que calcule la
  668.   suma S de 1*1 + 2*2 + 3*3 + ... hasta que dicha suma sea mayor
  669.   o igual que N. Entonces escribirá N, S y el último número que
  670.   ha elevado al cuadrado.
  671. ende
  672. begine "prpr"
  673.  
  674.   CALCULO DEL PRODUCTO DE DOS NUMEROS MEDIANTE SUMAS SUCESIVAS
  675.  
  676.   Programa que obtenga el producto de dos números enteros positivos
  677.   mediante sumas sucesivas.
  678. ende
  679. begine "prpr"
  680.  
  681.   TABLA DE MULTIPLICAR DE UN NUMERO
  682.  
  683.   Programa que imprima la tabla de multiplicar de un número entero
  684.   positivo.
  685. ende
  686. begine "prpr"
  687.  
  688.   CONTADOR DE VOCALES DE UNA FRASE
  689.  
  690.   Programa que lea una frase en una línea, y cuente su número de vocales.
  691. ende
  692. begine "prpr"
  693.   CALCULO DEL PRODUCTO DE DOS NUMEROS MEDIANTE EL ALGORITMO RUSO
  694.  
  695.   Programa que calcule el producto de dos números enteros positivos
  696.   mediante el denominado "algoritmo ruso del producto".
  697.  
  698.   Al algoritmo consiste en duplicar el primer factor y dividir (cociente
  699.   entero) por 2 el segundo, obteniendo un producto equivalente, salvo si
  700.   el segundo factor es impar, en cuyo caso es necesario acumular previa-
  701.   mente el primero en donde se va a obtener el resultado. El proceso
  702.   termina cuando el segundo factor se hace 0.
  703.  
  704.   Ejemplo: Multiplicación de 25*6.
  705.  
  706.                  Primer factor    Segundo factor    Acumulador
  707.                  -------------    --------------    ----------
  708.                       25                6                0
  709.                       50                3               50
  710.                      100                1              150
  711.                      200                0              150
  712. ende
  713. begine "prpr"
  714.  
  715.   CALCULO DEL MAYOR Y MENOR SUELDO DE UNA PERSONA
  716.  
  717.   Programa que lea 20 datos, compuesto cada uno de ellos por un nombre
  718.   de persona y su sueldo neto mensual, y obtenga e imprima el nombre y
  719.   sueldo de la persona que más cobra y de la que menos. Si hay varias se
  720.   imprime la primera que aparezca en la secuencia de entrada.
  721. ende
  722. end lección 4
  723.  
  724. ; LECCION 5
  725. begin
  726. begine "psc"
  727. pregunta
  728.   ¿Cuándo puede ser útil una función como la siguiente?
  729.   void funcion (void) { }
  730. respuesta
  731.   Es útil durante el desarrollo de un programa mientras no se
  732.   implementa dicha función.
  733. ende
  734. begine "test"
  735. pregunta
  736.   ¿Cuál de las opciones del menú no es un prototipo de esta función?
  737.   void func (float f1, float f2) { printf ("%f", f1 >= f2 ? f1 : f2); }
  738. opciones
  739.  void func (float f1, float f2);
  740.  void func (float f1, float);
  741.  void func (f1, float f2);
  742.  void func (float, float);
  743.  func (float, float);
  744. respuesta
  745. 5
  746. ende
  747. begine "psc"
  748. pregunta
  749.   ¿Qué dos acciones realiza esta sentencia return?
  750.   return 10;
  751. respuesta
  752.   La primera es forzar una salida inmediata de la función en que se
  753.   encuentra. La segunda es devolver el valor 10.
  754. ende
  755. begine "psc"
  756. pregunta
  757.  
  758.   ¿Cuáles son los tres tipos de variables según el lugar de declaración?
  759. respuesta
  760.   Los tres tipos de variables según el lugar de declaración son:
  761.   variables locales, parámetros formales y variables globales.
  762. ende
  763. begine "psc"
  764. pregunta
  765.   /* ¿Qué imprime este programa? */
  766.   #include <stdio.h>
  767.   void main (void) { int x = 1; { int x; printf ("%d", x); } }
  768. respuesta
  769.   El valor que se imprime es impredecible puesto que a la segunda
  770.   variable local declarada no se le ha asignado ningún valor.
  771. ende
  772. begine "pcc"
  773. pregunta
  774.   ¿Cuántos argumentos se le pasan a esta función?
  775.   func (2, (3, 4), 5);
  776. respuesta
  777. 3
  778. ende
  779. begine "test"
  780. pregunta
  781.  
  782. ¿Cómo se denominan a las variables que se declaran fuera de las funciones?
  783. opciones
  784. Variables locales
  785. Parámetros formales
  786. Variables globales
  787. respuesta
  788. 3
  789. ende
  790. begine "psc"
  791. pregunta
  792.   ¿Cuáles son los cuatro especificadores de clase de almacenamientos
  793.   soportados por C?
  794. respuesta
  795.   Los cuatro especificadores de clase de almacenamiento son:
  796.   extern, static, register y auto.
  797. ende
  798. begine "test"
  799. pregunta
  800.   En la siguiente declaración de la variable x,
  801.   ¿se reserva memoria para ella?
  802.   extern int x;
  803. opciones
  804. No
  805. respuesta
  806. 2
  807. ende
  808. begine "psc"
  809. pregunta
  810.  
  811.   ¿Cuál es el principal uso del especificador extern?
  812. respuesta
  813.   El principal uso del especificador extern se da cuando un programa
  814.   está compuesto por varios ficheros y una variable ha de ser global
  815.   a las funciones de más de un fichero.
  816. ende
  817. begine "psc"
  818. pregunta
  819.   El especificador static aplicado en la declaración de una variable
  820.   hace que esta variable exista a lo largo de todo el programa. Pero,
  821.   ¿Cuáles son los dos usos que tiene este especificador?
  822. respuesta
  823.  1º) Como variable estática local: hace que una variable local no pierda
  824.  su valor al terminar la función. 2º) Como variable estática global: hace
  825.  que sea imposible acceder a esta variable desde otro fichero.
  826. ende
  827. begine "test"
  828. pregunta
  829.   ¿Se puede asegurar que el contenido de la variable x se va a guardar
  830.   en un registro de la CPU?
  831.   register char x;
  832. opciones
  833. SI
  834. NO
  835. respuesta
  836. 2
  837. ende
  838. begine "psc"
  839. pregunta
  840.   ¿De qué tipo son las variables x e y?
  841.   { int x;
  842.     auto int y; }
  843. respuesta
  844.  Según su tipo son enteras. Según el lugar de la declaración son de tipo
  845.  local (fijaos en las llaves). Según el especificador de clase de almace-
  846.  namiento son de tipo automáticas (el especificador auto es redundante).
  847. ende
  848. begine "psc"
  849. pregunta
  850.  
  851.  ¿Qué debemos hacer si queremos utilizar una función en varios ficheros?
  852. respuesta
  853.   Debemos especificar su prototipo al principio de cada fichero en los
  854.   que vamos a utilizar dicha función.
  855. ende
  856. begine "test"
  857. pregunta
  858.   ¿Qué llamada a la función f de las opciones del menú es correcta
  859.   teniendo en cuenta las siguientes declaraciones?
  860.   int x, y, z; void f (int px, int *py, int *pz);
  861. opciones
  862.   f (x, y, z);
  863.   f (&x, &y, &z);
  864.   f (x, &y, &z);
  865.   f (&x, y, z);
  866. respuesta
  867. 3
  868. ende
  869. begine "test"
  870. pregunta
  871.   ¿Qué devuelve la función func cuyo prototipo es el que se indica?
  872.   int *func (void);
  873. opciones
  874. Un valor de tipo entero.
  875. Un puntero a entero.
  876. respuesta
  877. 2
  878. ende
  879. begine "pcc"
  880. pregunta
  881.  
  882.   ¿Cuántas formas hay de pasar un array como parámetro?
  883. respuesta
  884. 3
  885. ende
  886. begine "psc"
  887. pregunta
  888.   ¿Qué hay que hacer en un programa C para que se le puede pasar
  889.   información desde la línea de órdenes del sistema operativo?
  890. respuesta
  891.   Declarar la función main de la siguiente forma:
  892.   void main (int argc, char *argv[]);
  893. ende
  894. begine "test"
  895. pregunta
  896.   Si la lógica de una función es similar en forma iterativa y en
  897.   forma recursiva, ¿cuál de las dos formas es preferible utilizar?
  898. opciones
  899.  La forma iterativa.
  900.  La forma recursiva.
  901. respuesta
  902. 1
  903. ende
  904. begint
  905. begine "psc"
  906. pregunta
  907.  
  908.   ¿Cómo se puede realizar la compilación separada en Turbo C?
  909. respuesta
  910.  
  911.   Creando un fichero de proyecto.
  912. ende
  913. endt
  914. begine "test"
  915. pregunta
  916.   ¿En qué librería nos encontramos la información necesaria para
  917.   declarar una función con un número variable de argumentos?
  918. opciones
  919. <stdio.h>
  920. <stdlib.h>
  921. <stdarg.h>
  922. <conio.h>
  923. respuesta
  924. 3
  925. ende
  926. begine "psc"
  927. pregunta
  928.   ¿Qué diferencia hay entre estas dos directivas?
  929.   #include <stdlib.h>
  930.   #include "stdlib.h"
  931. respuesta
  932.   Que la primera forma (#include <stdlib.h>) busca el fichero stdlib.h en
  933.   los directorios del sistema y la segunda forma (#include "stdlib.h") lo
  934.   busca en el directorio de trabajo.
  935. ende
  936. begine "PCC"
  937. pregunta
  938. #define X "macro"
  939. x = printf ("%s %s", "X", X);
  940. ¿Cómo expande el preprocesador la asignación de x anterior?
  941. respuesta
  942. x = printf ("%s %s", "X", "macro");
  943. ende
  944. begine "PCC"
  945. pregunta
  946. #define X(a,b) ((a)+a*b)
  947. x = X (5+8, 6);
  948. ¿Cómo expande el preprocesador la asignación de x anterior?
  949. respuesta
  950. x = ((5+8)+5+8*6);
  951. ende
  952. begine "test"
  953. pregunta
  954.   #define X 10
  955.   #undef X
  956.   x = X; /* ¿Daría aquí error el compilador de C? */
  957. opciones
  958. No
  959. respuesta
  960. 1
  961. ende
  962. begine "psc"
  963. pregunta
  964.   ¿Por qué está mal, conceptualmente, esta constante simbólica?
  965.   #define PI = 3.141593
  966. respuesta
  967.   Lo correcto es:
  968.   #define PI 3.141593
  969.   La sentencia 'x=PI;' se expande en el primer caso a 'x== PI;'.
  970. ende
  971. begine "psc"
  972. pregunta
  973.   ¿Por qué está mal, conceptualmente, esta macro?
  974.   #define MAX(a,b) a>b?a:b
  975. respuesta
  976.   Lo correcto es:
  977.   #define MAX(a,b) ((a)>(b)?(a):(b))
  978.   Pensad qué pasaría en el primer caso con 'MAX(x&&y,z)'.
  979. ende
  980. begine "PCC"
  981. pregunta
  982. #define fac(a) (a)*fac((a)-1)
  983. x = fac(3);
  984. ¿Cómo expande el preprocesador la asignación de x anterior?
  985. respuesta
  986. x = (3)*fac((3)-1);
  987. ende
  988. begine "psc"
  989. pregunta
  990.  
  991.   ¿Qué hace la directiva #error?
  992. respuesta
  993.  
  994.   Hace que el compilador finalice la compilación.
  995. ende
  996. begine "psc"
  997. pregunta
  998.   Define una macro-función a la que se le pasa un número como argumento
  999.   y devuelve su valor absoluto.
  1000. respuesta
  1001.  
  1002.   #define ABS(X) ((X) >= 0 ? (X) : -(X))
  1003. ende
  1004. begine "psc"
  1005. pregunta
  1006.   Define una macro-función a la que se le pase un número como argumento
  1007.   y devuelva su cuadrado.
  1008. respuesta
  1009.  
  1010.   #define CUADRADO(X) ((X)*(X))
  1011. ende
  1012. begine "psc"
  1013. pregunta
  1014.   ¿Por qué a las directivas #if-#else-#endif, #if-#elif-#endif,
  1015.   #ifdef-#endif y #ifndef-#endif se les llama directivas de
  1016.   compilación condicional?
  1017. respuesta
  1018.   Porque compilan selectivamente parte del código fuente, es decir,
  1019.   que con ellas se puede compilar parte del código y dejar otras
  1020.   partes del código sin compilar.
  1021. ende
  1022. begint
  1023. begine "test"
  1024. pregunta
  1025.   ¿Es cierto que el operador defined sólo se puede utilizar en las
  1026.   expresiones correspondientes a las directivas #if y #elif?
  1027. opciones
  1028. No
  1029. respuesta
  1030. 1
  1031. ende
  1032. endt
  1033. begine "psc"
  1034. pregunta
  1035.   La directiva #line hace que el compilador crea que está compilando
  1036.   una determinada línea del código fuente y de un determinado fichero.
  1037.   ¿Cómo hace el preprocesador que el compilador crea tal cosa?
  1038. respuesta
  1039.  
  1040.  Cambiando los valores de las constantes predefinidas __LINE__ y __FILE__.
  1041. ende
  1042. begine "psc"
  1043. pregunta
  1044.  
  1045.   ¿Qué hace la directiva #pragma?
  1046. respuesta
  1047.   Le da ciertas instrucciones al compilador. Estas instrucciones y la
  1048.   forma de dárselas dependen de la implementación del C con la que se
  1049.   trabaje.
  1050. ende
  1051. begine "psc"
  1052. pregunta
  1053.  
  1054.   ¿Cuáles son las cinco constantes predefinidas?
  1055. respuesta
  1056.   Las constantes predefinidas son:
  1057.   __DATE__, __FILE__, __LINE__, __STDC__ y __TIME__
  1058. ende
  1059. begine "prpr"
  1060.  
  1061.   PROBABILIDADES BINOMIALES
  1062.  
  1063.     La función factorial sirve, entre otras cosas, para calcular las
  1064.   probabilidades binomiales, como ilustra este ejemplo:
  1065.  
  1066.     Un empleado coge todos los días un determinado tren para ir a
  1067.   trabajar, pero sabe que existe cierta probabilidad de que ese tren
  1068.   sea anulado. Teniendo en cuenta esa probabilidad, ¿cuáles son las
  1069.   de que en una semana sean cancelados 0, 1, 2 y hasta 5 trenes?
  1070.  
  1071.     Suponiendo que la cancelación del tren en un día cualquiera es
  1072.   independiente de lo que haya ocurrido en días anteriores, la fórmula
  1073.   que determina las probabilidades pedidas es:
  1074.  
  1075.                  n!          r          n - r
  1076.       c = --------------- * p  * (1 - p)
  1077.            (n - r!) * r!
  1078.                                 r
  1079.   (Nota: n! => factorial de n; p  => p elevado a r).
  1080.  
  1081.     Donde p es la probabilidad de que se cancele un tren, r el número
  1082.   de cancelaciones en una semana (0, 1, 2, ..., 5), n es el número de
  1083.   jornadas laborales de la semana (5 en este caso) y c es la probabilidad
  1084.   de que se produzcan r cancelaciones.
  1085.  
  1086.     Escriba un programa que acepte la introducción de la probabilidad p,
  1087.   verifique si está en el intervalo 0-1 y calcule el valor de c para los
  1088.   valores de r comprendidos entre 0 y 5 (es decir, las probabilidades de
  1089.   que se cancelen 0, 1, 2, ... hasta 5 trenes).
  1090.  
  1091.   (Nota: realizar tres funciones además de la función main: c(),
  1092.   factorial() y potencia()).
  1093.  
  1094. ende
  1095. begine "prpr"
  1096.  
  1097.   CALCULO DEL NUMERO DE FIBONACCI
  1098.  
  1099.   El número de Fibonacci viene dado por la siguiente función:
  1100.  
  1101.            ┌
  1102.            │ 0
  1103.   FIB(n) = ┤ 1
  1104.            │ FIB(n-1) + FIB(n-2)
  1105.            └
  1106.  
  1107.   Realizar una función que calcule el número de Fibonacci. Hacerlo en
  1108.   dos versiones: una iterativa y otra recursiva.
  1109. ende
  1110. begine "prpr"
  1111.  
  1112.   CALCULO DEL MAXIMO COMUN DIVISOR
  1113.  
  1114.   Un algoritmo muy conocido que halla el máximo común divisor de dos
  1115.   enteros es el algoritmo de Euclides. La función del máximo común
  1116.   divisor se define de la siguiente forma
  1117.  
  1118.              ┌
  1119.              │ GCD(N,M),       si N>M
  1120.   GCD(M,N) = ┤ M,              si N=0
  1121.              │ GCD(N,M MOD N), si N>0
  1122.              └
  1123.  
  1124.   donde M MOD N es M módulo N (el resto de dividir M por N). Constrúyase
  1125.   una función recursiva para este problema y obtener el GCD(20,6).
  1126. ende
  1127. begine "prpr"
  1128.  
  1129.   CALCULO DE LA RAIZ CUADRADA DE UN NUMERO
  1130.  
  1131.   Escribir una función recursiva que calcule la raíz cuadrada de un
  1132.   número. Leer las triplas de números N, A y E, donde N es el número
  1133.   del cual tiene que hallarse su raíz cuadrada, A es un valor aproxi-
  1134.   mado de la raíz cuadrada y E es el error de tolerancia del resulta-
  1135.   do. Utilícese esta función, definida por
  1136.  
  1137.                 ┌
  1138.                 │ A,
  1139.   ROOT(N,A,E) = ┤                            si │A*A-N│<E
  1140.                 │ ROOT(N,((A*A)+N)/(2*A),E), en caso contrario
  1141.                 └
  1142. ende
  1143. begine "prpr"
  1144.  
  1145.   CALCULO DE LA FUNCION DE ACKERMAN
  1146.  
  1147.   Una importante función teórica, que se conoce por función de Ackerman,
  1148.   viene definida por
  1149.  
  1150.            ┌
  1151.            │ N+1,             si M=0
  1152.   A(M,N) = ┤ A(M-1,1),        si N=0
  1153.            │ A(M-1,A(M,N-1)), en caso contrario
  1154.            └
  1155.  
  1156.   Obtener una función recursiva y otra iterativa del problema.
  1157. ende
  1158. begine "prpr"
  1159.  
  1160.   CALCULO DEL NUMERO DE PARTICIONES DISTINTAS DE UN NUMERO ENTERO
  1161.  
  1162.   Ciertas aplicaciones necesitan conocer el número de particiones
  1163.   distintas de un número entero dado N; es decir, de cuantas formas
  1164.   distintas se puede expresar N como suma de sumandos enteros. Por
  1165.   ejemplo, N=5 admite las particiones
  1166.  
  1167.     1+1+1+1+1, 5, 1+2+2, 3+1+1, 2+3, 1+4, y 1+1+1+2
  1168.  
  1169.   Si denotamos por Q(M,N) el número de formas en que el entero M
  1170.   se puede expresar como una suma, de sumandos no superiores a N,
  1171.   entonces el número de particiones de N viene dado por Q(M,N). La
  1172.   función Q(M,N) viene definida recursivamente por
  1173.            ┌
  1174.            │ 1,                 si M=1 y para todo N
  1175.            │ 1,                 si N=1 y para todo M
  1176.   Q(M,N) = ┤ Q(M,M),            si M<N
  1177.            │ 1+Q(M,M-1),        si M=N
  1178.            │ Q(M,N-1)+Q(M-N,N), si M>N
  1179.            └
  1180.   Formular una función recursiva de este problema.
  1181. ende
  1182. begine "prpr"
  1183.  
  1184.   SUPRESION DE ELEMENTOS DUPLICADOS EN UN VECTOR
  1185.  
  1186.   Diséñese una función que acepte como parámetro un vector que
  1187.   contenga elementos duplicados. La función tiene que sustituir
  1188.   cada valor repetido por -1. La función devuelve el número de
  1189.   elementos modificados.
  1190. ende
  1191. end lección 5
  1192.  
  1193. ; LECCION 6
  1194. begin
  1195. begine "pcc"
  1196. pregunta
  1197.   ¿Cuál es el índice más alto con el que podemos acceder a este array?
  1198.   double a [100];
  1199. respuesta
  1200. 99
  1201. ende
  1202. begine "psc"
  1203. pregunta
  1204.   ¿Qué pasa al ejecutar las siguientes sentencias?
  1205.   int v [10];
  1206.   v [20] = 30;
  1207. respuesta
  1208.   Que el valor 30 se escribe en una posición de memoria no reservada.
  1209.   Esto quiere decir que el valor 30 se puede escribir sobre el código
  1210.   del sistema operativo, sobre el código de un programa residente, ...
  1211. ende
  1212. begine "pcc"
  1213. pregunta
  1214.   ¿Cuántas formas hay de pasar un array unidimensional como argumento
  1215.   a una función?
  1216. respuesta
  1217. 3
  1218. ende
  1219. begine "psc"
  1220. pregunta
  1221.   ¿Cuántos elementos de tipo char reservaremos para un array que va a
  1222.   contener una cadena de caracteres con un máximo de 10 caracteres?
  1223. respuesta
  1224.   Reservaremos 11 caracteres, ya que el último elemento del array está
  1225.   reservado para el carácter nulo '\0'.
  1226. ende
  1227. begine "psc"
  1228. pregunta
  1229.  
  1230.   ¿Son iguales los caracteres '0' y '\0'?
  1231. respuesta
  1232.   No son iguales. El carácter '0' tiene código ASCII 48 y el carácter
  1233.   '\0' tiene código ASCII 0.
  1234. ende
  1235. begine "pcc"
  1236. pregunta
  1237.  
  1238.   ¿Cuántos caracteres ocupa la constante de cadena "hola" en memoria?
  1239. respuesta
  1240. 5
  1241. ende
  1242. begine "test"
  1243. pregunta
  1244.   ¿Se puede considerar que un array bidimensional es un array
  1245.   unidimensional donde cada elemento es un array unidimensional?
  1246. opciones
  1247. No
  1248. respuesta
  1249. 1
  1250. ende
  1251. begine "psc"
  1252. pregunta
  1253.   ¿Qué error hay en estas sentencias C?
  1254.   float f[5][4];
  1255.   f[4,3] = 1.2;
  1256. respuesta
  1257.   Que la segunda sentencia no es una sentencia C.
  1258.   Sería correcto: f[4][3] = 1.2.
  1259. ende
  1260. begine "test"
  1261. pregunta
  1262.   Si m es una matriz, ¿es cierta esta comparación?
  1263.   m == &m[0][0]
  1264. opciones
  1265. No
  1266. respuesta
  1267. 1
  1268. ende
  1269. begine "psc"
  1270. pregunta
  1271.  
  1272.   ¿A qué se llama array de cadenas?
  1273. respuesta
  1274.   Se llama array de cadenas a un array unidimensional donde cada
  1275.   elemento en una cadena de caracteres.
  1276. ende
  1277. begine "psc"
  1278. pregunta
  1279.   ¿Qué error hay en las siguientes sentencias?
  1280.   int n = 4;
  1281.   char am[n][5][6];
  1282. respuesta
  1283.   El error está en el tamaño de la primera dimensión del array am.
  1284.   La especificación de los tamaños de las dimensiones de los arrays
  1285.   en las declaraciones deben ser expresiones constantes.
  1286. ende
  1287. begine "psc"
  1288. pregunta
  1289.   ¿Hay algún error en la siguiente sentencia?
  1290.   void f (int m[][]) { /* ... */ }
  1291. respuesta
  1292.   Sí, ya que falta la especificación de la segunda dimensión del
  1293.   array m en el parámetro de la función f.
  1294. ende
  1295. begine "psc"
  1296. pregunta
  1297.   ¿Qué error hay en las siguientes sentencias?
  1298.   int v1[3] = { 1, 2, 3 }
  1299.   int v2 = 10;
  1300. respuesta
  1301.  
  1302.   El error está en que falta un ; después de }.
  1303. ende
  1304. begine "test"
  1305. pregunta
  1306.   ¿Son equivalentes las dos inicializaciones de cadena?
  1307.   char cadena [] = "123";
  1308.   char cadena [] = { '1', '2', '3' };
  1309. opciones
  1310. No
  1311. respuesta
  1312. 2
  1313. ende
  1314. begine "test"
  1315. pregunta
  1316.   ¿Hay algún error en esta inicialización?
  1317.   double d [10] = { 1.1, 2e2, 3 };
  1318. opciones
  1319. No
  1320. respuesta
  1321. 2
  1322. ende
  1323. begine "psc"
  1324. pregunta
  1325.   ¿Es correcta esta inicialización?
  1326.   int matriz [] [] = { { 2, 3 }, { 4, 5 } };
  1327. respuesta
  1328.  
  1329.   No es correcta, ya que no se ha especificado la segunda dimensión
  1330.   de matriz.
  1331. ende
  1332. begine "prpr"
  1333.  
  1334.   Programa que lea 20 números enteros sobre un vector y que calcule e
  1335.   imprima las sumas de las componentes de índice par y las de índice
  1336.   impar.
  1337. ende
  1338. begine "prpr"
  1339.  
  1340.   Programa que carga una matriz de 5 filas y 10 columnas con números
  1341.   enteros, imprimiendo los valores máximo y mínimo, y sus posiciones
  1342.   dentro de la matriz.
  1343. ende
  1344. begine "prpr"
  1345.  
  1346.   Programa que genera e imprime una matriz unitaria de orden N. Una
  1347.   matriz unitaria de orden N es la que tiene N filas y N columnas con
  1348.   todas sus componenetes a 0 excepto las de su diagonal principal,
  1349.   que están a 1.
  1350. ende
  1351. begine "prpr"
  1352.  
  1353.   Programa que imprime un CUADRADO LATINO de orden N. Un cuadrado
  1354.   latino de orden N es una matriz cuadrada en la que su primera
  1355.   fila contiene los N primeros números naturales y cada una de las
  1356.   siguientes N-1 filas contiene la rotación de la fila anterior un
  1357.   lugar a la derecha.
  1358.  
  1359.   Ejemplo:
  1360.  
  1361.     Cuadrado latino de orden 4.
  1362.  
  1363.       1  2  3  4
  1364.       4  1  2  3
  1365.       3  4  1  2
  1366.       2  3  4  1
  1367. ende
  1368. begine "prpr"
  1369.  
  1370.   Programa que carga un vector numérico de N componentes y obtiene e
  1371.   imprime los M valores menores y los M valores mayores. N y M son
  1372.   introducidos por el usuario; M ha de ser menor que N.
  1373. ende
  1374. begine "prpr"
  1375.  
  1376.   Programa que realiza la clasificación completa de una matriz numérica
  1377.   en orden creciente (de izquierda a derecha y de arriba a abajo).
  1378. ende
  1379. begine "prpr"
  1380.  
  1381.   Programa que lee una frase y averigua si es palíndroma. Una frase es
  1382.   palíndroma si se lee igual de izquierda a derecha que de derecha a
  1383.   izquierda.
  1384.  
  1385.   Ejemplos: «LE SACO SUS OCAS EL», «ANILINA».
  1386.  
  1387.   Considerar también el caso de las frases que se leen igual pero que
  1388.   no se escriben igual (debido a los espacios en blanco).
  1389.  
  1390.   Ejemplo: «DABALE ARROZ A LA ZORRA EL ABAD».
  1391. ende
  1392. begine "prpr"
  1393.  
  1394.   Diseñar un programa que lea dos matrices n*n y presente un menú de
  1395.   opciones para sumarlas, restarlas o multiplicarlas.
  1396. ende
  1397. begine "prpr"
  1398.  
  1399.   Diseñar un programa que lea una matriz n*n y calcule e imprima su
  1400.   traspuesta.
  1401. ende
  1402. begine "prpr"
  1403.  
  1404.   Diseñar un programa que genere 100 números aleatorios distintos.
  1405.  
  1406.   Nota: para saber los números que ya han sido generados, almacenar
  1407.   éstos en un array.
  1408. ende
  1409. begine "prpr"
  1410.  
  1411.   Realizar un programa que lea una matriz cuadrada de dimensión máxima
  1412.   50x50 y haga lo siguiente:
  1413.  
  1414.   - Imprima la media de los elementos de la diagonal principal.
  1415.  
  1416.   - Imprima la suma de los elementos por debajo de la diagonal principal
  1417.     y por encima de ella.
  1418. ende
  1419. begine "prpr"
  1420.   Una fábrica de automóviles produce 4 modelos de coches cuyos precios
  1421.   de venta son respectivamente 1.5, 1.75, 2.42 y 2.6 millones de pesetas.
  1422.  
  1423.   Esta empresa cuenta con cuatro centros de distribución y venta. Se
  1424.   dispone de una relación de datos correspondientes al tipo de vehículo
  1425.   vendido y punto de distribución en que se produjo la venta del mismo.
  1426.  
  1427.   Realizar un programa que leyendo la relación de datos anterior, calcule
  1428.   e imprima:
  1429.  
  1430.     1.- Volumen de ventas total.
  1431.  
  1432.     2.- Volumen de ventas por centro.
  1433.  
  1434.     3.- Porcentaje de unidades totales vendidas en cada centro.
  1435.  
  1436.     4.- Porcentaje de unidades de cada modelo vendidos en cada centro,
  1437.         sobre el total de ventas de la empresa.
  1438. ende
  1439. begine "prpr"
  1440.  
  1441.   Son números primos aquéllos divisibles solamente entre sí mismos y 1.
  1442.   Para localizar los números primos del 1 al 1000, puede empezarse con
  1443.   2 y dividir todos los números mayores entre 2, con la eliminación de
  1444.   los que no tengan residuo para pasar después al mayor número que no
  1445.   haya sido eliminado y dividirlo de la misma forma. Este es un método
  1446.   directo que se basa en la definición. Sin embargo, se requiere mucho
  1447.   tiempo porque la división es larga. Una forma más rápida consiste en
  1448.   utilizar el procedimiento de la criba de Erastótenes:
  1449.  
  1450.   Llena un vector con valores del 1 al 1000. Empieza con el segundo
  1451.   valor para igualar a 0 todos los múltiplos en el vector (todos los
  1452.   múltiplos de 2, esto se consigue en el programa C con incrementos
  1453.   de la variable índice de 2 en 2). Sigue, con el siguiente número
  1454.   diferente de cero y repite el proceso sucesivamente. Concluido el
  1455.   proceso, todas las anotaciones diferentes de cero serán números
  1456.   primos. Escribe un programa para utilizar este procedimiento e
  1457.   imprimir una tabla de números primos.
  1458. ende
  1459. begine "prpr"
  1460.  
  1461.   Realizar una función que acepte tres vectores: A, B y C. Los vectores
  1462.   A y B son dos vectores ordenados en orden creciente de números enteros,
  1463.   sus longitudes no tienen porqué ser iguales. Nuestra función ha de
  1464.   rellenar el vector C (cuya longitud es la suma de las longitudes de los
  1465.   vectores A y B) intercalando A y B, de tal forma que al final del pro-
  1466.   ceso el vector C es un vector ordenado en orden creciente con los
  1467.   números enteros de los vectores A y B.
  1468. ende
  1469. begine "prpr"
  1470.  
  1471.   Dado un vector X de n elementos enteros en que n es impar, escribir un
  1472.   programa que calcule la mediana del vector. La mediana es un valor su-
  1473.   perior a la mitad del número de elementos del vector e inferior a la
  1474.   otra mitad. Por ejemplo, dado el vector X
  1475.  
  1476.     X1  X2  X3  X4  X5  X6  x7  X8  X9
  1477.     17  -3  21   2   9  -4   6   8  11
  1478.  
  1479.   de nueve elementos, la ejecución del programa debería dar el valor 8.
  1480. ende
  1481. begine "prpr"
  1482.  
  1483.   Una matriz A de dimensión nxm es simétrica si
  1484.  
  1485.     a(i,j) = a(j,i)  para  1≤i≤n y 1≤j≤m
  1486.  
  1487.   Escribir un programa que lea una matriz (de dimensión no mayor de
  1488.   10x10) y determine si es simétrica o no. Supóngase que los elementos
  1489.   de la matriz son enteros.
  1490.  
  1491.   Ejemplo de matriz simétrica:
  1492.  
  1493.     ┌         ┐
  1494.     │ 1  4  7 │
  1495.     │ 4  2  9 │
  1496.     │ 7  9  3 │
  1497.     └         ┘
  1498. ende
  1499. begine "test"
  1500. pregunta
  1501.   ¿Son equivalentes las dos sentecias printf() siguientes?
  1502.     printf (expresion_cadena_1, expresion_cadena_2);
  1503.     printf ((expresion_cadena_1, expresion_cadena_2));
  1504. opciones
  1505.  No lo son
  1506.  Sí lo son
  1507. respuesta
  1508. 1
  1509. ende
  1510. end lección 6
  1511.  
  1512. ; LECCION 7
  1513. begin
  1514. begine "psc"
  1515. pregunta
  1516.   ¿De qué tipo es esta variable?
  1517.   double *pd;
  1518. respuesta
  1519.  
  1520.   pd es un puntero a double.
  1521. ende
  1522. begine "test"
  1523. pregunta
  1524.  
  1525.   ¿Cuáles son los dos operadores especiales de punteros?
  1526. opciones
  1527. && y *
  1528. & y *
  1529. || y *
  1530. | y *
  1531. & y |
  1532. & y +
  1533. respuesta
  1534. 2
  1535. ende
  1536. begine "psc"
  1537. pregunta
  1538.   Al operador & se le suele llamar operador de dirección y al operador *
  1539.   se le suele llamar operador de contenido. Si p es un puntero a float,
  1540.   ¿qué diferencia hay entre las expresiones p, &p y *p?
  1541. respuesta
  1542.   p contiene la dirección de memoria a la que apunta el puntero; &p es
  1543.   la dirección de memoria donde está ubicada la variable puntero; y *p
  1544.   es el valor que hay en la posición de memoria apuntada por el puntero.
  1545. ende
  1546. begine "psc"
  1547. pregunta
  1548.  
  1549.   ¿Qué diferencia hay entre las expresiones v y *&v?
  1550. respuesta
  1551.  
  1552.   No hay ninguna diferencia, son expresiones equivalentes.
  1553. ende
  1554. begine "pcc"
  1555. pregunta
  1556.   Sea el tamaño del tipo long 4 bytes y supongamos la declaración:
  1557.   long *pl; Si pl apunta a la dirección (en decimal) 5000, al hacer
  1558.   pl += 2; ¿qué valor toma pl?
  1559. respuesta
  1560. 5008
  1561. ende
  1562. begine "test"
  1563. pregunta
  1564.   Sea la declaración:
  1565.   int *pi;
  1566.   Qué valor toma la expresión: sizeof (*pi) == sizeof (int).
  1567. opciones
  1568. valor cierto (1)
  1569. valor falso (0)
  1570. respuesta
  1571. 1
  1572. ende
  1573. begine "psc"
  1574. pregunta
  1575.   ¿Qué funcion(es) hemos visto en esta lección para asignar y desasignar
  1576.   memoria dinámicamente?
  1577. respuesta
  1578.   Para asignar memoria dinámicamente hemos vista las funciones malloc()
  1579.   y calloc(). Y para liberar memoria tenemos la función free().
  1580. ende
  1581. begine "psc"
  1582. pregunta
  1583.   ¿Qué hace la siguiente sentencia C?
  1584.   p = (float *) malloc (n * sizeof (float));
  1585. respuesta
  1586. La expresión malloc (n*sizeof(float)) reserva (n*sizeof(float)) bytes de
  1587. memoria. Al moldearlo con (float *) y asignarlo a p, p se convierte en un
  1588. array de n elementos de tipo float (en realidad, p es un puntero al ppio).
  1589. ende
  1590. begine "psc"
  1591. pregunta
  1592.  
  1593.   ¿Cuándo se libera la memoria asignada dinámicamente?
  1594. respuesta
  1595.   La memoria se libera bien al acabar el programa o bien al utilizar una
  1596.   función de liberación de memoria dinámica como free().
  1597. ende
  1598. begine "test"
  1599. pregunta
  1600.   ¿Es cierta o falsa esta expresión?
  1601.   v[i] == *(v+i)
  1602. opciones
  1603. Cierta
  1604. Falsa
  1605. respuesta
  1606. 1
  1607. ende
  1608. begine "test"
  1609. pregunta
  1610.  
  1611.   ¿Qué notación es más eficiente, la de array o la de puntero?
  1612. opciones
  1613. Notación array
  1614. Notación puntero
  1615. respuesta
  1616. 2
  1617. ende
  1618. begine "psc"
  1619. pregunta
  1620.   ¿Ocupa el mismo espacio de memoria las 2 declaraciones siguientes?
  1621.   int x[10][10], *y[10];
  1622. respuesta
  1623.   No. Si sizeof (int) == 2, la primera declaración reserva 10x10x2
  1624.   bytes de memoria; mientras que la segunda, si sizeof (int *) == 2,
  1625.   reserva 10x2 bytes de memoria.
  1626. ende
  1627. begine "psc"
  1628. pregunta
  1629.  
  1630.   ¿Adónde apunta un puntero que tenga el valor NULL?
  1631. respuesta
  1632.  
  1633.   A ningún sitio.
  1634. ende
  1635. begine "test"
  1636. pregunta
  1637.   Sea:
  1638.     int *x, y;
  1639.   ¿Qué opción del menú es la cierta?
  1640. opciones
  1641. x e y son punteros a int
  1642. x e y son de tipo int
  1643. x es un puntero a int e y es de tipo int
  1644. x es de tipo int e y es un puntero a int
  1645. respuesta
  1646. 3
  1647. ende
  1648. begine "psc"
  1649. pregunta
  1650.   ¿De qué tipo es la variable pf?
  1651.   float (*pf) (float, float);
  1652. respuesta
  1653.   pf es un puntero a una función que devuelve un número de tipo float
  1654.   y acepta como argumentos dos números de tipo float.
  1655. ende
  1656. begint
  1657. begine "test"
  1658. pregunta
  1659.   ¿En qué librería de Turbo C están definidas las funciones qsort(),
  1660.   bsearch(), lfind() y lsearch()?
  1661. opciones
  1662. <stdio.h>
  1663. <stdlib.h>
  1664. <alloc.h>
  1665. <conio.h>
  1666. respuesta
  1667. 2
  1668. ende
  1669. endt
  1670. begine "psc"
  1671. pregunta
  1672.   ¿Por qué se produce un error de compilación en esta línea?
  1673.   int x = 10, y; void *pv; pv = (void *) &x; y = *pv;
  1674. respuesta
  1675. El único error que existe en la línea anterior está en la sentencia y=*pv;
  1676. y más concretamente en la expresión *pv. Esto es debido a que las opera-
  1677. ciones con punteros están ligada al tipo base. Correcto: y = *(int *)pv;
  1678. ende
  1679. begine "psc"
  1680. pregunta
  1681.   ¿Qué diferencia hay entre las dos sentencias siguientes;
  1682.   x += y;
  1683.   x =+ y;
  1684. respuesta
  1685.   La sentencia (x += y) es equivalente a (x = x + y); y la sentencia
  1686.   (x =+ y) es equivalente a (x = (+y)).
  1687. ende
  1688. begine "psc"
  1689. pregunta
  1690.   ¿Qué diferencia hay entre las dos sentencias siguientes;
  1691.   x *= y;
  1692.   x =* y;
  1693. respuesta
  1694. Si y es un puntero, la primera sentencia es incorrecta porque no se puede
  1695. aplicar el producto a los punteros. Si y no es un puntero, la segunda sen-
  1696. tencia es incorrecta porque se le está aplicando el operador de contenido.
  1697. ende
  1698. begine "psc"
  1699. pregunta
  1700.   ¿Qué diferencia hay entre las dos sentencias siguientes;
  1701.   x &= y;
  1702.   x =& y;
  1703. respuesta
  1704. Si x es un puntero, la primera sentencia es incorrecta porque no se puede
  1705. aplicar el and de bits a punteros. Si x no es un puntero, la segunda sen-
  1706. tencia es incorrecta porque se le está intentando asignar una dirección.
  1707. ende
  1708. begine "test"
  1709. pregunta
  1710.   Sea la declaración
  1711.     int x;
  1712.   ¿podemos hacer: *(const int *)&x = 20;?
  1713. opciones
  1714. No
  1715. respuesta
  1716. 2
  1717. ende
  1718. begine "psc"
  1719. pregunta
  1720.   ¿De qué tipo es la variable x?
  1721.   const char * (* x) (char * const, const char * const);
  1722. respuesta
  1723.   x es un puntero a función que devuelve un puntero a constante char
  1724.   y acepta dos argumentos: el primero es un puntero constante a char
  1725.   y el segundo es un puntero constante a constante char.
  1726. ende
  1727. begint
  1728. begine "test"
  1729. pregunta
  1730.   ¿Qué opción del menú podemos asegurar que es cierta considerando
  1731.   esta declaración?
  1732.   float *p;
  1733. opciones
  1734. p es un puntero near
  1735. p es un puntero far
  1736. p es un puntero huge
  1737. p es un puntero near, far o huge dependiendo del modelo de memoria elegido
  1738. respuesta
  1739. 4
  1740. ende
  1741. begine "test"
  1742. pregunta
  1743.   ¿Cuál de las opciones del menú no corresponde a un modelo de memoria de
  1744.   compilación en Turbo C?
  1745. opciones
  1746. Tiny
  1747. Small
  1748. Medium
  1749. Compact
  1750. Large
  1751. Big
  1752. Huge
  1753. respuesta
  1754. 6
  1755. ende
  1756. endt
  1757. begine "prpr"
  1758.  
  1759.   Escribe un programa que acepte como entrada una cadena de un texto
  1760.   y sustituya todos los conjuntos de dos o más espacios seguidos por
  1761.   espacios únicos.
  1762. ende
  1763. begine "prpr"
  1764.  
  1765.   Escribe un programa que lee dos fechas y calcule e imprima la
  1766.   diferencia en días que hay entre las dos fechas introducidas.
  1767.  
  1768.   Las fechas serán cadenas de caracteres con el fomato: "dd/mm/aa".
  1769.  
  1770.   Nota: Sería conveniente diseñar una función que acepte como
  1771.   argumento un string conteniendo la fecha y devuelve 1 si el
  1772.   string contiente una fecha correcta o 0 en caso contrario. Para
  1773.   que la fecha sea convalidada, ésta debe superar las siguientes
  1774.   pruebas:
  1775.  
  1776.     - La longitud del string correspondiente a la fecha es de 8
  1777.       caracteres.
  1778.     - Los caracteres tercero y sexto son /.
  1779.     - Los restantes caracteres son números.
  1780.     - El valor del mes tiene que estar entre 1 y 12.
  1781.     - El valor del día tiene que estar 1 y el número de días de
  1782.       ese mes.
  1783.  
  1784.   Si se quiere tener en cuenta los años bisiestos recordar que
  1785.   aquellos años divisibles de forma exacta por 4 son bisiestos, y
  1786.   que el número de años bisiestos transcurridos desde el princi-
  1787.   pio del siglo es la parte entera del cociente año/4.
  1788.  
  1789. ende
  1790. begine "prpr"
  1791.  
  1792.   Implementar las funciones que se describen a continuación junto
  1793.   con una función main para probarlas.
  1794.  
  1795.   Las funciones a implemetar son:
  1796.  
  1797.   - Función que acepte dos strings: s1 y s2, y devuelva el número
  1798.     de caracteres que hay en s1 que no están en s2.
  1799.  
  1800.   - Función que acepte dos strings: s1 y s2, y devuelva el número
  1801.     de caracteres que hay en s1 que están en s2.
  1802.  
  1803.   - Función que acepte un string que puede contener caracteres
  1804.     repetidos y lo devuelva sin ningún carácter repetido en su
  1805.     interior.
  1806.  
  1807.   - Función que acepte un substring y un número n y devuelva un
  1808.     string con tantas copias del substring como indique el número n.
  1809.  
  1810.   - Función que acepte un string y lo devuelva con todos sus carac-
  1811.     teres convertidos en mayúsculas. Los caracteres con código ascii
  1812.     mayor de 127: ñ, á, é, í, ó y ú serán convertidos respectivamente
  1813.     a: Ñ, A, E, I, O, U.
  1814.  
  1815. ende
  1816. end lección 7
  1817.  
  1818. ; LECCION 8
  1819. begin
  1820. begine "psc"
  1821. pregunta
  1822.   ¿Cuántos bytes ocupa en memoria la variable st?
  1823.   struct { float f; char *pc; } st;
  1824. respuesta
  1825.  
  1826.   sizeof (st) == sizeof (float) + sizeof (char *)
  1827. ende
  1828. begine "psc"
  1829. pregunta
  1830.   ¿De qué tipo son las variables st1, st2 y st3?
  1831.   struct st { int x, y; } *st1, st2, st3[10];
  1832. respuesta
  1833.   st1 es un puntero a struct st
  1834.   st2 es un struct st
  1835.   st3 es un array de 10 elementos de tipo struct st
  1836. ende
  1837. begine "test"
  1838. pregunta
  1839.   Dada la declaración
  1840.     struct x { int x; } x;
  1841.   ¿qué operación de entre las que aparece en el menú es falsa?
  1842. opciones
  1843.   struct x y;
  1844.   x = 10;
  1845.   x.x = 20;
  1846.   x.x = sizeof (x);
  1847.   x.x = sizeof (x.x);
  1848.   x.x = sizeof (struct x);
  1849.   x.x = sizeof (struct x *);
  1850.   x.x = *&x.x;
  1851.   x.x = sizeof (x) == sizeof (struct x);
  1852. respuesta
  1853. 2
  1854. ende
  1855. begine "psc"
  1856. pregunta
  1857.   Dado
  1858.     struct { int y[10]; } x[10];
  1859.   ¿qué diferencia hay entre las expresiones x[2].y[3] y (x[2].y)[3]?
  1860. respuesta
  1861.   No hay ninguna diferencia puesto que los paréntesis no alteran
  1862.   la precedencia. Nota: serían expresiones incorrectas en C las dos
  1863.   siguientes: x[2](.y[3]) y x[2].(y[3])
  1864. ende
  1865. begine "test"
  1866. pregunta
  1867.   ¿Cuál es la expresión equivalente a la asignación siguiente y que
  1868.   es además la única que no provoca un error de compilación?
  1869.   struct { int x, y; } *st; st->x = 100;
  1870. opciones
  1871.   (*st).x = 100;
  1872.   *st.x = 100;
  1873.   *(st.x) = 100;
  1874. respuesta
  1875. 1
  1876. ende
  1877. begine "psc"
  1878. pregunta
  1879. ¿En qué caso es conveniente pasar una estructura íntegra en lugar de un
  1880. puntero a una estructura como argumento a una función?
  1881. respuesta
  1882. Nunca: siempre es mejor pasar el puntero a la estructura. Si se desea que
  1883. la función llamadora no modifique la estructura, declaramos un puntero a
  1884. estructura constante:  tipo funcion (const struct nombre_estructura *);
  1885. ende
  1886. begine "psc"
  1887. pregunta
  1888.  
  1889.   ¿Son necesarios los campos de bits en C?
  1890. respuesta
  1891.   Los campos de bits no son necesarios en C, puesto que todas las opera-
  1892.   ciones que se pueden realizar con los campos de bits también se pueden
  1893.   realizar con los operadores de bits (&, |, ~, ^).
  1894. ende
  1895. begine "test"
  1896. pregunta
  1897.   ¿Cuántos bytes ocupa en memoria la variable st?
  1898.   struct { int x; union { char ch; float f; } u; } st;
  1899. opciones
  1900.   sizeof (st.x) + sizeof (st.u)
  1901.   sizeof (int) + sizeof (char) + sizeof (float)
  1902.   sizeof (int)
  1903.   sizeof (float)
  1904. respuesta
  1905. 1
  1906. ende
  1907. begine "PCC"
  1908. pregunta
  1909.   ¿Qué imprime la sentencia printf?
  1910.   enum { a = 10, b, c = 20 } e = b;
  1911.   printf ("e = %d", e);
  1912. respuesta
  1913. e = 11
  1914. ende
  1915. begine "psc"
  1916. pregunta
  1917.   typedef int ent;
  1918.   typedef ent *pe;
  1919.   pe (*var) (ent); /* ¿de qué tipo es la variable var? */
  1920. respuesta
  1921.   La variable var es un puntero a una función que devuelve un
  1922.   puntero a entero y acepta como argumento un entero.
  1923. ende
  1924. begine "test"
  1925. pregunta
  1926.   Los operadores que tienen más prioridad en C son (), [], ->, .
  1927.   y su asociatividad es de izquierda a derecha.
  1928. opciones
  1929. Afirmación cierta
  1930. Afirmación falsa
  1931. respuesta
  1932. 1
  1933. ende
  1934. begine "test"
  1935. pregunta
  1936.   El operador que tiene menos prioridad en C es el operador coma (,)
  1937.   y después le siguen los operadores de asignación.
  1938. opciones
  1939. Afirmación cierta
  1940. Afirmación falsa
  1941. respuesta
  1942. 1
  1943. ende
  1944. begine "psc"
  1945. pregunta
  1946.  
  1947.   ¿Cuáles son los operadores que se asocian de derecha a izquierda?
  1948. respuesta
  1949.   Los operadores unarios, el operador condicional ? y los operadores
  1950.   de asignación.
  1951. ende
  1952. begine "prpr"
  1953.  
  1954.   Diseñar un programa que lea dos árboles binarios y muestre un mensaje
  1955.   diciciendo si los dos árboles son iguales.
  1956. ende
  1957. begine "prpr"
  1958.  
  1959.   Diseñar un programa que lea un árbol binario, lo copie a otro árbol
  1960.   binario exceptuando las hojas del primero (el segundo árbol binario
  1961.   será igual que el primero pero sin las hojas de él) y lo imprima.
  1962.  
  1963.   Por ejemplo, si el árbol binario introducido es:
  1964.  
  1965.             6
  1966.           /   \
  1967.         2      10
  1968.       /  \       \
  1969.     0     3       12
  1970.         /        /  \
  1971.       1        11    20
  1972.  
  1973.   El árbol a crear será:
  1974.  
  1975.             6
  1976.           /   \
  1977.         2      10
  1978.          \       \
  1979.           3       12
  1980.  
  1981. ende
  1982. begine "prpr"
  1983.  
  1984.   Diseñar un programa que lea dos árboles binarios y forme e imprima
  1985.   otro árbol binario cuya información sea la suma de las correspon-
  1986.   dientes informaciones númericas contenidas en los dos árboles leídos.
  1987.  
  1988.   Se supone que si no existe el correspondiente nodo en alguno de los
  1989.   árboles se supondrá que la información contenida en el nodo de dicho
  1990.   árbol es cero.
  1991. ende
  1992. begine "prpr"
  1993.  
  1994.   Se desea construir una estructura dinámica de datos como la que se
  1995.   muestra en la figura:
  1996.  
  1997.          lista_numerica ──────────────────┐
  1998.                                           │
  1999.     lista_alfabetica ─┐                   │ ┌──────────────────────┐
  2000.                     ┌─┼───────────────────┼─┼────────────────────┐ │
  2001.         ┌──┬───────┬┼┬┐      ┌──┬───────┬┬┼┐       ┌──┬───────┬┬┐
  2002.         │10│Manolo │ │ │      │ 5│Juan   │ │ │       │15│Antonio│ │ │
  2003.         └──┴───────┴┴┼┘      └──┴───────┴┼┴┘       └──┴───────┴─┴─┘
  2004.                     └─┼───────────────────┘ │
  2005.                       └─────────────────────┘
  2006.   Como se ve, uno de los campos puntero enlaza nodos por orden ascendente
  2007.   de la clave numérica (5, 10, 15, ...), y el otro por orden descendente
  2008.   de la clave alfabética (Manolo, Juan, Antonio, ...).
  2009.  
  2010.   Se debe escribir un programa que permite realizar operaciones de in-
  2011.   sertar, eliminar y buscar elementos (número entero y cadena de carac-
  2012.   teres), además de listar todos los elementos según la clave deseada
  2013.   (numérica o alfabética).
  2014.  
  2015. ende
  2016. begine "prpr"
  2017.  
  2018.   Diseñar un programa que forme un árbol binario de números enteros
  2019.   introducidos por el usuario e imprima la información contenida en
  2020.   cada nodo por niveles. Es decir, primero el nodo raíz (nivel 0),
  2021.   luego sus hijos (nivel 1), después los hijos de éstos (nivel 2) y
  2022.   así sucesivamente.
  2023.  
  2024.   La función del recorrido del árbol por niveles puede hacerse con el
  2025.   siguiente pseudocódigo:
  2026.  
  2027.   <Construir una cola vacía cuyos nodos contengan un puntero a nodos
  2028.   del árbol y un entero para indicar el correspondiente nivel>
  2029.  
  2030.   <Incluir en la cola un primer nodo que contenga un puntero al nodo
  2031.   raíz y el nivel 0 e inicializar un puntero p, que señalando a nodos
  2032.   de la cola, señale a ese primer nodo>
  2033.  
  2034.   MIENTRAS (p no sea nulo)
  2035.  
  2036.     <Añadir a la cola los punteros a los hijos del nodo del árbol cuyo
  2037.     puntero está incluido en la cola y apuntado por p, así como sus
  2038.     correspondientes niveles>
  2039.  
  2040.     <Hacer p igual al siguiente de p>
  2041.  
  2042.   FINMIENTRAS
  2043.  
  2044.   <Imprimir la información contenida en los nodos del árbol señalados
  2045.   por los sucesivos punteros de la cola y los correspondientes niveles>
  2046.  
  2047. ende
  2048. begine "prpr"
  2049.  
  2050.   Desarrollar un programa que realice la suma de dos polinomios.
  2051.  
  2052.   Los dos polinomios se representan en listas lineales encabezadas por
  2053.   p y q, el polinomio resultado está encabezado por el puntero r.
  2054.  
  2055.   La información contenida en cada nodo de las listas está compuesta de
  2056.   coeficiente y exponente.
  2057.  
  2058.   Nota: las listas no están ordenadas ni respecto a los coeficientes ni
  2059.   respecto a los exponentes.
  2060. ende
  2061. begine "prpr"
  2062.  
  2063.   Supóngase que se está haciendo un cierto tratamiento con una serie de
  2064.   municipios de diversas provincias, para ello se utiliza la siguiente
  2065.   estructura: unas listas "horizontales" formadas cada una de ellas por
  2066.   municipios pertenecientes ala misma provincia y una lista "vertical"
  2067.   formada por todas las cabeceras de cada una de las listas horizontales.
  2068.  
  2069.   Se pide:
  2070.  
  2071.     1) Implementar las funciones necesarias para buscar en la estructura
  2072.     un municipio dado de una provincia dada. Si está se devolverá un pun-
  2073.     tero al nodo correspondiente; en caso contrario el puntero devolverá
  2074.     valor NULL.
  2075.  
  2076.     2) Insertar en la estructura un municipio dado de una provincia dada
  2077.     teniendo en cuenta los siguientes puntos:
  2078.  
  2079.       - Si el municipio pertenece a una provincia ya existente, se
  2080.       insertará el nuevo elemento al principio de la lista horizontal
  2081.       correspondiente.
  2082.  
  2083.       - Si el municipio pertenece a una provincia nueva, se deberá
  2084.       insertar al final de la lista vertical la nueva provincia que
  2085.       deberá tener una lista horizontal de un único elemento: ese
  2086.       municipio.
  2087.  
  2088. ende
  2089. begine "prpr"
  2090.  
  2091.   Diseñar un programa para manipular una cola.
  2092.  
  2093.   Una cola es una estructura de datos en la que el primer elemento
  2094.   introducido es el primero en salir.
  2095.  
  2096.   Las únicas operaciones que se pueden realizar con una cola son:
  2097.  
  2098.     - Inicializarla.
  2099.     - Introducir un elemento.
  2100.     - Sacar un elemento.
  2101.     - Liberar nodos.
  2102.  
  2103.   Hay dos estructuras posibles para la implementación de una cola:
  2104.  
  2105.     1) Una lista lineal enlazada con dos punteros de cabecera: uno que
  2106.        apunta al primer nodo de la lista y otro que apunta al último
  2107.        nodo de la lista.
  2108.  
  2109.     2) Una lista lineal enlazada circular donde el puntero de cabecera
  2110.        apunta al último nodo de la lista y el puntero siguiente de este
  2111.        último nodo apunta al primer nodo de la lista.
  2112.  
  2113. ende
  2114. begine "prpr"
  2115.  
  2116.   Diseñar algoritmos no recursivos para hacer recorridos inorden,
  2117.   preorden, postorden y por niveles en un árbol binario.
  2118.  
  2119.   Consejo: para ello es conveniente utilizar pilas y colas.
  2120. ende
  2121. begine "prpr"
  2122.   Diseñar un programa para manejar un árbol n-ario
  2123.  
  2124.   Un árbol n-ario (también llamados multicaminos) es un árbol donde
  2125.   cada nodo puede tener n hijos. Por ejemplo, un nodo puede tener 2
  2126.   hijos, otro 10 hijos, otro 1, ...
  2127.  
  2128.   Una estructura adecuada para implementar un árbol n-ario es que en
  2129.   vez de utilizar un puntero al hijo izquierdo y un puntero al hijo
  2130.   derecho como en los árboles binarios, utilizamos un puntero a una
  2131.   lista lineal enlazada donde cada nodo de esta lista apunta a un
  2132.   nodo hijo del nodo del árbol al que pertenece dicha lista. Las
  2133.   inserciones en la lista han de ser al final de ésta para conservar
  2134.   el orden de los nodos hijos; para facilitar las inserciones en la
  2135.   lista es conveniente que ésta sea circular y el puntero a la cabe-
  2136.   cera de la lista apunte al último nodo de ella.
  2137.  
  2138.   Realizar también una función que recibe un puntero a un árbol n-ario
  2139.   y devuelve un puntero a un árbol binario equivalente al árbol n-ario
  2140.   recibido.
  2141. ende
  2142. end lección 8
  2143.  
  2144. ; LECCION 9
  2145. begin
  2146. begine "test"
  2147. pregunta
  2148.  
  2149.   ¿Cuál es la salida estándar por defecto?
  2150. opciones
  2151. Teclado
  2152. Pantalla
  2153. Impresora
  2154. Disco
  2155. respuesta
  2156. 2
  2157. ende
  2158. begine "test"
  2159. pregunta
  2160.  
  2161.   ¿Cuántos flujos se asocian con un fichero cuando se abre el fichero?
  2162. opciones
  2163. Ninguno
  2164. Uno
  2165. Dos
  2166. Depende de la forma en que se abra el fichero
  2167. Depende del tipo de fichero
  2168. Depende del tipo de flujo
  2169. respuesta
  2170. 2
  2171. ende
  2172. begine "psc"
  2173. pregunta
  2174.   ¿Cuál es la diferencia principal entre los flujos de texto y los
  2175.   flujos binarios?
  2176. respuesta
  2177.  La diferencia principal es que la correspondencia de caracteres entre
  2178.  el flujo y el fichero es de uno a uno en el caso de los flujos binarios,
  2179.  y no siempre es de uno a uno en el caso de los flujos de texto.
  2180. ende
  2181. begine "test"
  2182. pregunta
  2183.  
  2184.   ¿Qué son los identificadores stdin, stdout y stderr?
  2185. opciones
  2186. Palabras claves de C.
  2187. Tipos definidos.
  2188. Constantes simbólicas.
  2189. Variables globales.
  2190. respuesta
  2191. 4
  2192. ende
  2193. begint
  2194. begine "psc"
  2195. pregunta
  2196.   ¿Cuáles son los flujos predefinidos que añade Turbo C a los tres
  2197.   flujos predefinidos del ANSI C (stdin, stdout y stderr)?
  2198. respuesta
  2199.   Los dos flujos predefinidos que añade TURBO C al ANSI C son:
  2200.   stdaux y stdprn.
  2201. ende
  2202. endt
  2203. begine "psc"
  2204. pregunta
  2205.  
  2206.   ¿De qué tipo son las variables stdin, stdout y stderr?
  2207. respuesta
  2208.   Las variables stdin, stdout y stderr son punteros a ficheros:
  2209.   FILE *stdin, *stdout, *stderr;
  2210. ende
  2211. begine "test"
  2212. pregunta
  2213.   ¿Es cierta la siguiente afirmación? Los flujos predefinidos stdin,
  2214.   stdout y stderr se abren automáticamente al principio del programa
  2215.   y se cierran automáticamente al final del programa.
  2216. opciones
  2217. Afirmación cierta
  2218. Afirmación falsa
  2219. respuesta
  2220. 1
  2221. ende
  2222. begint
  2223. begine "psc"
  2224. pregunta
  2225.  
  2226.   ¿Cómo se puede escribir en impresora en Turbo C?
  2227. respuesta
  2228.   Utilizando el flujo stdprn. Por ejemplo, con la función fprintf se
  2229.   escribiría: fprintf (stdprn, "mensaje");
  2230. ende
  2231. endt
  2232. begine "psc"
  2233. pregunta
  2234.   ¿Cuáles son los cuatro pasos principales para poder trabajar
  2235.   con un fichero?
  2236. respuesta
  2237.   Los cuatro pasos son:
  2238.         1) Declarar variable fichero.   2) Abrir el fichero.
  2239.         3) Operar con el fichero.       4) Cerrar el fichero.
  2240. ende
  2241. begine "psc"
  2242. pregunta
  2243.  
  2244.   ¿Cuáles son las funciones de apertura y cerrado de ficheros?
  2245. respuesta
  2246.  Los ficheros se abren con la función fopen() y se cierran con la función
  2247.  fclose(). El valor devuelto por fopen() es necesario comprobarlo siempre.
  2248.  El valor devuelto por fclose() es frecuente no comprobarlo.
  2249. ende
  2250. begine "psc"
  2251. pregunta
  2252.   ¿Cuál es la principal diferencia entre las funciones printf(),
  2253.   fprintf(), sprintf() y cprintf() (esta última sólo en Turbo C)?
  2254. respuesta
  2255.  La diferencia es el destino de la salida. La salida de printf() va a la
  2256.  salida estándar, la de fprintf() va a un fichero, la de sprintf() va a
  2257.  un string y la de cprintf() (sólo en Turbo C) va a la consola (pantalla).
  2258. ende
  2259. begine "psc"
  2260. pregunta
  2261.  
  2262.   ¿Qué significa volcar un fichero?
  2263. respuesta
  2264. Si el flujo está asociado con un fichero de salida, significa copiar la
  2265. información que hay en el buffer de salida al fichero. Si el flujo está
  2266. asociado con un fichero de entrada, significa vaciar el buffer de entrada.
  2267. ende
  2268. begine "psc"
  2269. pregunta
  2270.   ¿Cómo serían los bucles while para leer un fichero de texto y un
  2271.   fichero binario si se lee carácter a carácter?
  2272. respuesta
  2273.   /* fichero binario */                        /* fichero de texto */
  2274.   for (getc (pfb); ! feof (pfb); getc (pfb))   while (getc (pft) != EOF)
  2275.     ;                                            ;
  2276. ende
  2277. begine "psc"
  2278. pregunta
  2279.   En C se suele trabajar con el sistema de ficheros de alto nivel
  2280.   en el que a cada fichero se le asocia un flujo. Pero hay otro más
  2281.   antiguo y en desuso actualmente, ¿cuál es?
  2282. respuesta
  2283.   El sistema de ficheros preguntado es el sistema de ficheros de
  2284.   bajo nivel, llamado también sistema de ficheros tipo UNIX o E/S
  2285.   sin buffer.
  2286. ende
  2287. begine "psc"
  2288. pregunta
  2289.  
  2290.   ¿Qué es un descriptor de fichero?
  2291. respuesta
  2292.   Un descriptor de fichero es un número entero que se asocia a cada
  2293.   fichero abierto en C cuando se trabaja con el sistema de ficheros
  2294.   de bajo nivel.
  2295. ende
  2296. begine "psc"
  2297. pregunta
  2298.   ¿Cuáles son las funciones equivalentes a fopen() y fclose() en el
  2299.   sistema de ficheros de bajo nivel?
  2300. respuesta
  2301.   Las funciones equivalentes a fopen() y fclose() en el sistema de
  2302.   ficheros de bajo nivel son open() y close() respectivamente.
  2303. ende
  2304. begine "test"
  2305. pregunta
  2306.   ¿Es portable hoy día un programa que utilice el sistema de ficheros
  2307.   de bajo nivel?
  2308. opciones
  2309. No
  2310. respuesta
  2311. 2
  2312. ende
  2313. begine "prpr"
  2314. /*
  2315.   Este programa concatena varios ficheros y los presenta en la salida
  2316.   estándar (la pantalla normalmente). Si redireccionamos la salida
  2317.   (con >) concatenamos varios ficheros en otro fichero. Si no hay ningún
  2318.   argumento, se lee de la estrada estándar (el teclado normalmente).
  2319. */
  2320.  
  2321. #include <stdio.h>  /* FILE, stdin, fopen (), NULL, fprintf (), stderr,
  2322.                        fclose (), getc (), putc (), stdout */
  2323. #include <stdlib.h> /* exit () */
  2324.  
  2325. void main (int argc, char *argv[])
  2326. {
  2327.   FILE *pf;
  2328.   void copiar_fichero (FILE *pf);
  2329.  
  2330.   if (argc == 1) /* ningún argumento; copiar la entrada estándar */
  2331.     copiar_fichero (stdin);
  2332.   else
  2333.     while (--argc)
  2334.       if ((pf = fopen (*++argv, "r")) == NULL)
  2335.         {
  2336.           fprintf (stderr, "\nError: No se puede abrir el fichero %s.\n",
  2337.                    *argv);
  2338.           exit (1);
  2339.         }
  2340.       else
  2341.         {
  2342.           copiar_fichero (pf);
  2343.           fclose (pf);
  2344.         }
  2345. }
  2346.  
  2347. /* copiar el fichero pf en la salida estándar */
  2348. void copiar_fichero (FILE *pf)
  2349. {
  2350.   int c;
  2351.  
  2352.   while ((c = getc (pf)) != EOF)
  2353.     putc (c, stdout);
  2354. }
  2355.  
  2356. /*
  2357.   La propuesta de programa que se propone es cambiar este programa
  2358.   para que el primer argumento leído desde la línea de órdenes del
  2359.   sistema operativo sea el fichero de destino y todos los demás ar-
  2360.   gumentos son los ficheros de entrada que se han de concatener en
  2361.   orden en el fichero de destino. De este modo no necesitamos re-
  2362.   direccionar el programa como en el ejemplo. Si el usuario ejecuta
  2363.   el programa sin ningún argumento se le informa con un mensaje de
  2364.   error.
  2365. */
  2366. ende
  2367. begine "prpr"
  2368.  
  2369.   Implementar las funciones de librería fgets() y fputs(), utilizando
  2370.   en el primer caso la función getc() y en el segundo la función putc().
  2371. ende
  2372. begine "prpr"
  2373.  
  2374.   Hacer un programa que acepte varios argumentos desde la línea de
  2375.   comando del sistema operativo en la forma:
  2376.  
  2377.     nombre_programa "texto" fichero_1 fichero_2 ...
  2378.  
  2379.   es decir, que el primer argumento sea un texto entre comillas y a
  2380.   partir del segundo argumento, inclusive el segundo, una serie de
  2381.   ficheros.
  2382.  
  2383.   El programa tiene que decir el nombre del fichero y el número de
  2384.   línea de este fichero en el cual aparece la primera ocurrencia de
  2385.   texto.
  2386. ende
  2387. begine "prpr"
  2388.  
  2389.   Hacer un programa que lea un fichero de texto y escriba el número
  2390.   de líneas y el número de caracteres que tiene ese fichero.
  2391. ende
  2392. begine "prpr"
  2393.  
  2394.  Construir un programa que lee un fichero de texto e imprima una lista
  2395.  de todas las palabras aparecidas en el fichero junto con los números
  2396.  de líneas en las que aparecen. La lista de palabras se escribe en orden
  2397.  alfabético y la lista de números de línea para cada palabra se escriben
  2398.  de menor a mayor.
  2399.  
  2400.  Ejemplo:
  2401.  
  2402.  Fichero de texto:
  2403.  
  2404.  1 Se considera como palabra
  2405.  2 una sencuencia de caracteres
  2406.  3 entre dos espacios o
  2407.  4 caracteres de nueva línea.
  2408.  5 Posible estructura: árbol con un
  2409.  6 campo para el string línea y otro
  2410.  7 campo contiene un puntero al
  2411.  8 principio de una lista ordenada
  2412.  9 que contiene los números de líneas.
  2413.  
  2414.  Salida:
  2415.  
  2416.  al 7
  2417.  campo 6 7
  2418.  caracteres 2 4
  2419.  como 1
  2420.  considera 1
  2421.  con 5
  2422.  contiene 7 9
  2423.  de 2 4 8 9
  2424.  dos 3
  2425.  el 6
  2426.  entre 3
  2427.  espacios 3
  2428.  estructura: 5
  2429.  línea 4 6
  2430.  líneas 9
  2431.  lista 8
  2432.  los 9
  2433.  nueva 4
  2434.  números 9
  2435.  o 3
  2436.  ordenada 8
  2437.  otro 6
  2438.  palabra 1
  2439.  para 6
  2440.  posible 5
  2441.  principio 8
  2442.  puntero 7
  2443.  que 9
  2444.  Se 1
  2445.  secuencia 2
  2446.  string 6
  2447.  un 5 7
  2448.  una 2 8
  2449.  y 6
  2450.  árbol 5
  2451.  
  2452. ende
  2453. begine "prpr"
  2454.  Queremos implementar una estructura de datos que represente el servicio
  2455.  de autobuses de una ciudad, teniendo en cuentra que las paradas estarán
  2456.  representadas por un carácter y las líneas de autobuses por números.
  2457.  
  2458.  La estructura resultante ha de ser una lista de nodos con todas las
  2459.  paradas de la ciudad, y asociado a cada parada una sola lista con la
  2460.  información de los autobuses que pasan por ella y una referencia a
  2461.  la siguiente parada para cada línea.
  2462.  
  2463.  1.- Codificar un programa en C que construya la anterior estructura a
  2464.  partir de un fichero de texto con la siguiente información: una línea
  2465.  de texto por cada línea de autobús, de forma que primero figure el
  2466.  número de línea y después en orden de adyacencia las paradas de esa
  2467.  línea.
  2468.  
  2469.  2.- Construir en C una función que reciba una lista de paradas inter-
  2470.  medias y devuelva si es o no posible hacer ese recorrido y cuál sería
  2471.  la sucesión de autobuses que se habría de coger. Suponer que entre dos
  2472.  paradas sólo hay una posible línea.
  2473. ende
  2474. begine "prpr"
  2475.  
  2476.   Una característica importante de las funciones fread() y fwrite() es
  2477.   que permiten leer y escribir estructuras respectivamente, es decir,
  2478.   que podemos trabajar con lo que se llama en lenguajes de gestión:
  2479.   registros.
  2480.  
  2481.   Supongamos que tenemos declarada la variable vst que es del tipo
  2482.   compuesto estructura:
  2483.  
  2484.   struct st vst;
  2485.  
  2486.   entonces podemos escribir un registro de tipo struct st en el fichero
  2487.   pf de la siguiente forma:
  2488.  
  2489.   fwrite (&vst, sizeof (struct st), 1, pf);
  2490.  
  2491.   y leer registros de la siguiente forma:
  2492.  
  2493.   fread (&vst, sizeof (struct st), 1, pf);
  2494.  
  2495.   Cuando se va a trabajar con estructuras como la descrita conviene
  2496.   abrir el fichero en modo binario, ya que se suele abrir en modo
  2497.   texto cuando lo vamos a procesar línea a línea.
  2498.  
  2499.   Después de esta introducción vamos a proponer un programa que trabaje
  2500.   con registros de ficheros:
  2501.  
  2502.   Un fichero de referencia de los libros de una biblioteca está consti-
  2503.   tuido por registros del siguiente tipo:
  2504.  
  2505.     a) Número de referencia del libro, entero. No hay números de
  2506.        referencia repetidos.
  2507.     b) Autor, 25 caracteres.
  2508.     c) Título del libro, 50 caracteres.
  2509.     d) Tema del libro, 8 caracteres.
  2510.  
  2511.   Este fichero se denomina LIBROS.DAT, y viene ordenado por números de
  2512.   referencia.
  2513.  
  2514.   Realizar un programa que permita altas, bajas y consultas con el
  2515.   fichero LIBROS.DAT.
  2516.  
  2517.   Una vez que tenemos el fichero LIBROS.DAT, se debe realizar otro
  2518.   programa que haga lo siguiente: partiendo de dicho fichero, se tiene
  2519.   que formar primero una lista encadenada en memoria, por orden alfa-
  2520.   bético del tema, y a igualdad de tema, por orden alfabético del autor,
  2521.   y a igualdad de autor, por orden del número de referencia. Una vez
  2522.   formada dicha lista, el programa debe generar a partir de ella tantos
  2523.   ficheros como temas haya. Cada fichero tendrá el nombre del tema, sin
  2524.   extensión, y estará formado por los registros de los libros de dicho
  2525.   tema, conteniendo cada registro el número de referencia, el autor y
  2526.   el título, con tamaños iguales a los del fichero de entrada.
  2527.  
  2528. ende
  2529. begine "prpr"
  2530.  
  2531.  Realizar un programa para el mantenimiento de los miembros de una aso-
  2532.  ciación de ámbito provincial, según los criterios siguientes:
  2533.  
  2534.    a) Al arrancar el programa, en primer lugar, leerá de un fichero de
  2535.       SOCIOS los datos de los mismos, formando con ellos una lista en-
  2536.       cadenada. Los registros del fichero de entrada están en orden al-
  2537.       fabético, por lo que se irán encadenando uno tras otro en el mis-
  2538.       mo orden en que sean leído.
  2539.  
  2540.    b) Tras esta operación, ofrecerá repetitivamente un menú con las
  2541.       opciones 1-ALTA, 2-BAJA, 3-CONSULTA y 4-FIN. Los procesos de alta
  2542.       y de baja mantendrán la lista encadenada en orden alfabético. No
  2543.       se admitirán nombres repetidos.
  2544.  
  2545.    c) Al terminar el programa (opción 4-FIN), se reescribirá el fichero
  2546.       SOCIOS, con los datos actualizados que se tengan en la lista enca-
  2547.       denada.
  2548.  
  2549.    d) Los registros del fichero se atienen al siguiente formato:
  2550.       1-Nombre: 30 caracteres.
  2551.       2-Domicilio: 30 caracteres.
  2552.       3-Teléfono: entero.
  2553.       4-Código postal: entero en el rango 1 al 999.
  2554.  
  2555.    e) En el proceso de alta se leerán de teclado todos los datos del
  2556.       nuevo socio. En el proceso de baja se leerá sólo el nombre. En
  2557.       el proceso de consulta, se leerá sólo el nombre y se mostrarán
  2558.       todos los datos en pantalla.
  2559.  
  2560. ende
  2561. begine "prpr"
  2562.  
  2563.  Un fichero de datos binario, de nombre PRECIOS.DAT, contiene registros
  2564.  formados como sigue:
  2565.  
  2566.    a) Identificación de un producto, 10 caracteres más el terminador.
  2567.    b) El precio en pesetas de dicho producto, un entero.
  2568.  
  2569.  Un segundo fichero contiene los datos de las sucesivas operaciones de
  2570.  venta a lo largo de un período de tiempo. El fichero, igualmente bi-
  2571.  nario, de nombre VENTAS.DAT, contiene registros formados por:
  2572.  
  2573.    a) Identificador del producto, como en el fichero anterior.
  2574.    b) Número de unidades vendidas de dicho producto, un entero.
  2575.  
  2576.  En este fichero, van consecutivos todos los elementos correspondientes
  2577.  a la misma operación de venta, terminando cada operación con un regis-
  2578.  tro que contiene un asterisco como único carácter identificador de pro-
  2579.  ducto, lo que cierra la factura de la operación, y a continuación sigue
  2580.  otra operación de venta de la misma manera, o el final del fichero.
  2581.  
  2582.  Realizar un programa que:
  2583.  
  2584.    1.- Gestione los dos ficheros anteriores: altas, bajas, consultas y
  2585.        modificaciones.
  2586.  
  2587.    2.- A partir del fichero de precios, construya un árbol binario orde-
  2588.        nado por identificadores de productos.
  2589.  
  2590.    3.- A partir del fichero de ventas, imprima las facturas de las dis-
  2591.        tintas operaciones, según el modelo siguiente:
  2592.  
  2593.          UNIDADES        ARTICULO         PRECIO UNITARIO      IMPORTE
  2594.               10         patatas               40                400
  2595.               ..         .......             .....             ......
  2596.               12         leche                110               1320
  2597.  
  2598.                          IMPORTE TOTAL ........................ 6850
  2599.  
  2600. ende
  2601. begine "prpr"
  2602.  
  2603.  Se han recogido en un fichero secuencial denominado VIAJES las
  2604.  informaciones relativas a todos los desplazamientos profesionales
  2605.  efectuados en una empresa durante un año. Cada vez que se produce
  2606.  un desplazamiento se crea un registro que consta de lo siguientes
  2607.  campo:
  2608.  
  2609.    - Nombre de la ciudad a donde se realizó el desplazamiento.
  2610.    - Fecha del desplazamiento.
  2611.    - Número de días de duración del desplazamiento.
  2612.    - Nombre de la persona que se ha desplazado.
  2613.  
  2614.  Estos datos se han registrado por orden cronológico y por lo tanto
  2615.  las informaciones no aparecen por el orden de los nombres de las
  2616.  ciudades.
  2617.  
  2618.  Se quiere obtener un listado ordenado alfabéticamente por ciudad
  2619.  donde aparezcan para cada ciudad:
  2620.  
  2621.    1º El número de viajes realizados.
  2622.    2º El coste de las dietas.
  2623.    3º El coste medio por día de estancia en esa ciudad.
  2624.    4º Al final del listado se imprimirá el coste total de las dietas
  2625.       para la empresa.
  2626.  
  2627.  El número de ciudades es inferior a 100.
  2628.  
  2629. ende
  2630. end lección 9
  2631.  
  2632. ; LECCION 10
  2633. begin
  2634. begine "test"
  2635. pregunta
  2636.  
  2637.   ¿Cuál es el uso más común de la macro NULL?
  2638. opciones
  2639. Para indicar el final de una cadena de caracteres.
  2640. Para indicar que un puntero no apunta a ningún sitio.
  2641. Para indicar el final de fichero en las operaciones de E/S.
  2642. respuesta 2
  2643. ende
  2644. begint
  2645. begine "test"
  2646. pregunta
  2647.  
  2648.  ¿Qué fichero de cabecera contiene las funciones de manejo de caracteres?
  2649. opciones
  2650. limits.h
  2651. ctype.h
  2652. string.h
  2653. mem.h
  2654. values.h
  2655. stdio.h
  2656. stdlib.h
  2657. locale.h
  2658. respuesta
  2659. 2
  2660. ende
  2661. endt
  2662. begine "test"
  2663. pregunta
  2664.   ¿Podemos asegurar que en la siguiente sentencia la asignación de
  2665.   y a x se realiza una sola vez en todos los compiladores de C?
  2666.   isspace (x = y);
  2667. opciones
  2668. No
  2669. respuesta
  2670. 2
  2671. ende
  2672. begine "test"
  2673. pregunta
  2674.   ¿Cuál es el resultado de esta expresión?
  2675.   x = isxdigit ('f') ? y : z;
  2676. opciones
  2677. y
  2678. z
  2679. 'f'
  2680. 1
  2681. 0
  2682. indefinido
  2683. respuesta
  2684. 1
  2685. ende
  2686. begine "pcc"
  2687. pregunta
  2688.   ¿Qué imprime la sentencia printf()?
  2689.   printf ("%d", strcmp ("A", "C"));
  2690. respuesta
  2691. -2
  2692. ende
  2693. begine "test"
  2694. pregunta
  2695.  
  2696.   ¿En qué fichero de cabecera se encuentran las funciones matemáticas?
  2697. opciones
  2698. mat.h
  2699. matem.h
  2700. matemat.h
  2701. matematicas.h
  2702. math.h
  2703. mathematics.h
  2704. respuesta
  2705. 5
  2706. ende
  2707. begint
  2708. begine "psc"
  2709. pregunta
  2710.   ¿Qué hacen las funciones window() en modo texto y setviewport() en
  2711.   modo gráfico?
  2712. respuesta
  2713.   Las funciones window() y setviewport() crean una ventana de trabajo
  2714.   en la pantalla.
  2715. ende
  2716. begine "psc"
  2717. pregunta
  2718.   textcolor (YELLOW);
  2719.   textbackgroung (BLUE);
  2720.   printf ("abc"); /* ¿Con qué color se escribe "abc" en pantalla? */
  2721. respuesta
  2722.  La cadena "abc" se escribe en pantalla en blanco sobre negro. Ahora bien,
  2723.  si se hubiera hecho: cprintf ("abc"); entonces la cadena "abc" se hubiera
  2724.  escrito en amarillo sobre azul.
  2725. ende
  2726. begine "test"
  2727. pregunta
  2728.  
  2729.   ¿Qué función es necesaria llamar para poder trabajar en modo gráfico?
  2730. opciones
  2731. cleardevice()
  2732. clearviewport()
  2733. closegraph()
  2734. detectgraph()
  2735. initgraph()
  2736. setgraphmode()
  2737. setviewport()
  2738. respuesta
  2739. 5
  2740. ende
  2741. endt
  2742. begine "prpr"
  2743.  
  2744.   Realiza un programa que resuelva una ecuación de segundo grado. Para
  2745.   ello, deberá leer los coeficientes a, b y c desde teclado y mostrará
  2746.   las dos soluciones por pantalla. Se tendrá en cuenta todos los posi-
  2747.   bles casos de error, como por ejemplo, división por cero y radicando
  2748.   negativo.
  2749. ende
  2750. begine "prpr"
  2751.  
  2752.   Realiza un programa para justificar un fichero de texto. Los datos
  2753.   de entrada serán los nombres de los ficheros de texto fuente y
  2754.   destino, así como dos números que representan columna izquierda
  2755.   y columna derecha. El fichero fuente ha de copiarse en el fichero
  2756.   destino pero con el texto justificado tanto a la izquierda como a
  2757.   la derecha.
  2758.  
  2759.   Por ejemplo, si el fichero de texto fuente contiene el párrafo
  2760.   anterior y lo queremos justificar entre las columnas 1 y 20, el
  2761.   fichero destino podría ser:
  2762.  
  2763.   Realiza un  programa
  2764.   para  justificar  un
  2765.   fichero  de   texto.
  2766.   Los datos de entrada
  2767.   serán los nombres de
  2768.   los   ficheros    de
  2769.   texto    fuente    y
  2770.   destino,  así   como
  2771.   dos   números    que
  2772.   representan  columna
  2773.   izquierda y  columna
  2774.   derecha. El  fichero
  2775.   fuente     ha     de
  2776.   copiarse    en    el
  2777.   fichero destino pero
  2778.   con     el     texto
  2779.   justificado tanto  a
  2780.   la izquierda como  a
  2781.   la derecha.
  2782.  
  2783. ende
  2784. begint
  2785. begine "prpr"
  2786.  
  2787.   Con las funciones proporcionadas por Turbo C en la librería de entrada
  2788.   y salida por consola, es relativamente fácil diseñar funciones para:
  2789.  
  2790.   - dibujar ventanas con un determinado marco y colores
  2791.   - hacer un menú de opciones, tanto horizontal como vertical
  2792.   - realizar una ventana de visualización que visualice un fichero de
  2793.     texto
  2794.   - editar una línea (un editor de más de una línea es mucho más
  2795.     complejo)
  2796.  
  2797.   Intenta realizar funciones como las que se acaba de mencionar para
  2798.   ser utilizadas en futuros programas. De esta forma nos podemos crear
  2799.   nuestra propia biblioteca de funciones.
  2800.  
  2801. ende
  2802. endt
  2803. end lección 10
  2804.  
  2805. ; LECCION 11
  2806. begin
  2807. begine "psc"
  2808. pregunta
  2809.   ¿En qué se diferencia el salto realizado por la función longjmp()
  2810.   con el salto realizado por la instrucción goto?
  2811. respuesta
  2812.   La diferencia está en que el goto realiza saltos locales, es decir,
  2813.   saltos dentro de una misma función, y la función longjmp() realiza
  2814.   saltos no locales, esto es, saltos de una función a otra.
  2815. ende
  2816. begine "psc"
  2817. pregunta
  2818.   ¿Para qué se utiliza las funciones y las macros declaradas en el
  2819.   fichero signal.h?
  2820. respuesta
  2821.   En el fichero signal.h hay declaradas dos funciones: raise() y signal()
  2822.   que se utilizan para enviar y recibir señales respectivamente.
  2823. ende
  2824. begine "psc"
  2825. pregunta
  2826.   ¿Cuál es la principal diferencia entre la asignación estática
  2827.   y la asignación dinámica de memoria?
  2828. respuesta
  2829.   En la asignación estática el tamaño de la memoria a reservar se
  2830.   calcula en tiempo de compilación. En la asignación dinámica dicho
  2831.   tamaño se calcula en tiempo de ejecución.
  2832. ende
  2833. begine "psc"
  2834. pregunta
  2835.   ¿Cuáles son las cuatro funciones de asignación dinámica definidas
  2836.   por el ANSI C?
  2837. respuesta
  2838.   Las funciones de asignación dinámica definidas por el ANSI C en
  2839.   el fichero de cabecera stdlib.h son: calloc(), malloc(), free()
  2840.   y realloc().
  2841. ende
  2842. begint
  2843. begine "psc"
  2844. pregunta
  2845.   ¿Cuáles son los tres grupos de funciones declaradas en el fichero
  2846.   process.h que nos permiten ejecutar otros programas o procesos?
  2847. respuesta
  2848.   Los tres grupos de funciones para ejecutar procesos son: las
  2849.   funciones exec..., las funciones spawn..., y la función system().
  2850. ende
  2851. begine "psc"
  2852. pregunta
  2853.   ¿Cuál es el denominador común de todas las funciones declaradas
  2854.   en el fichero de cabecera dir.h?
  2855. respuesta
  2856.   Todas las funciones declaradas en el fichero dir.h están relacionadas
  2857.   con los directorios.
  2858. ende
  2859. begine "psc"
  2860. pregunta
  2861.  
  2862.   ¿Para qué se utiliza en C la palabra clave interrupt?
  2863. respuesta
  2864.   La palabra clave interrupt se utiliza para declarar funciones de
  2865.   interrupción. Las funciones de interrupción son llamadas automá-
  2866.   ticamente cuando ocurre una determinada interrupción.
  2867. ende
  2868. begine "psc"
  2869. pregunta
  2870.   ¿Cuál es la característica común de todas las funciones declaradas
  2871.   en el fichero de cabecera dos.h?
  2872. respuesta
  2873.   Todas las funciones declaradas en el fichero dos.h están
  2874.   estrechamente relacionadas con el sistema operativo DOS.
  2875. ende
  2876. begine "test"
  2877. pregunta
  2878.   ¿Son imprescindibles las funciones declaradas en el fichero bios.h
  2879.   si se dispone de las funciones de dos.h?
  2880. opciones
  2881. No
  2882. respuesta
  2883. 2
  2884. ende
  2885. begine "prpr"
  2886.  
  2887.   Realiza un programa que lea el nombre (no ruta) de un programa
  2888.   ejecutable, lo busque en la unidad de disco de trabajo, y lo
  2889.   ejecute si lo encuentra.
  2890. ende
  2891. begine "prpr"
  2892.  
  2893.   Realiza un programa que mueva ficheros de un directorio a otro.
  2894.   Este programa aceptará dos argumentos, el primero es la especi-
  2895.   ficación de los ficheros (puede contener ruta y los caracteres
  2896.   comodín * y ?) y el segundo argumento es el nombre del directorio
  2897.   al cual se van a mover los ficheros.
  2898.  
  2899.   Consejo: comprobar si el directorio de destino está en la misma
  2900.   unidad que el directorio fuente (en el que están los ficheros a
  2901.   mover), y si es así, utilizar la función remove() del C para mover
  2902.   los ficheros; si en cambio el directorio de destino está en una
  2903.   unidad de disco diferente, entonces habrá que copiar los ficheros
  2904.   al directorio de destino y después borrarlos en el directorio origen.
  2905. ende
  2906. begine "prpr"
  2907.  
  2908.   Diseña un programa residente que visualice continuamente la hora
  2909.   actual en la esquina superior derecha de la pantalla.
  2910.  
  2911.   Consejo: la función que será llamada en cada interrupción de reloj
  2912.   tiene que ser declarada como interrupt. El programa se ha de terminar
  2913.   llamando a la función keep().
  2914. ende
  2915. endt
  2916. end lección 11
  2917.  
  2918. ; LECCION 12
  2919. begin
  2920. begine "psc"
  2921. pregunta
  2922.   ¿Qué tipo de funciones se encuentran declaradas en el fichero
  2923.   de cabecera stdlib.h?
  2924. respuesta
  2925. En el fichero stdlib.h se encuentran declaradas funciones de naturaleza
  2926. variada. Este fichero es una especie de cajón de sastre donde van a parar
  2927. todas aquellas funciones que no encajan en otros ficheros de cabecera.
  2928. ende
  2929. begine "test"
  2930. pregunta
  2931.  
  2932.   ¿Qué tipos de funciones hay declaradas en el fichero date.h?
  2933. opciones
  2934. Funciones de hora.
  2935. Funciones de fecha.
  2936. Funciones hora y fecha.
  2937. El fichero de cabecera date.h no existe en el estándar ANSI.
  2938. respuesta
  2939. 4
  2940. ende
  2941. begine "test"
  2942. pregunta
  2943.  
  2944.   ¿Con qué función podemos saber la fecha actual?
  2945. opciones
  2946. clock()
  2947. ctime()
  2948. gmtime()
  2949. localtime()
  2950. mktime()
  2951. strftime()
  2952. time()
  2953. respuesta
  2954. 7
  2955. ende
  2956. begint
  2957. begine "psc"
  2958. pregunta
  2959.   ¿Qué fichero de cabecera es necesario incluir en un programa
  2960.   para utilizar la palabra clave asm?
  2961. respuesta
  2962.  
  2963.   Ninguno, puesto que asm es una palabra clave.
  2964. ende
  2965. endt
  2966. begine "psc"
  2967. pregunta
  2968.  Escribe una definición para la macro atoi() usando la función atol(). La
  2969.  macro atoi() se encuentra declarada en el fichero de cabecera stdlib.h y
  2970.  convierte una cadena en un entero.
  2971. respuesta
  2972.  
  2973.   #define atoi(s)  ((int) atol (s))
  2974. ende
  2975. begint
  2976. begine "psc"
  2977. pregunta
  2978. Escribe una definición para la macro random() usando la función rand(). La
  2979. macro random() está declarada en el fichero stdlib.h de Turbo C y devuelve
  2980. un número aleatorio entre 0 y un número inferior al de su argumento.
  2981. respuesta
  2982.  
  2983.   #define random(num)   (rand () % (num))
  2984. ende
  2985. begine "psc"
  2986. pregunta
  2987. Escribe una definición para la macro randomize() usando las funciones
  2988. srand() y time(). La macro randomize() está declarada en el fichero de ca-
  2989. becera stdlib.h de Turbo C e inicializa el generador de números aleatorios
  2990. respuesta
  2991.  
  2992.   #define randomize()   srand ((unsigned) time (NULL))
  2993. ende
  2994. endt
  2995. begine "prpr"
  2996.  
  2997.   Implementa las funciones asctime() y strftime() de la librería time.h,
  2998.   ya que la funciones que suministra el C escribe los nombres de los días
  2999.   y los meses en inglés.
  3000. ende
  3001. begint
  3002. begine "prpr"
  3003.  
  3004.   Diseña un programa que lea una función matemática y la represente
  3005.   gráficamente en el monitor.
  3006.  
  3007. ende
  3008. endt
  3009. end lección 12
  3010.